From 124fd81ea2c718622164d4f70c2d13f4fbe2af7b Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 22 May 2020 14:43:24 -0700 Subject: [PATCH 01/70] More efficient DE gene calculation --- R/de.genes.R | 524 +++++++++++++++++++++++++++------------------- R/find_noise_cl.R | 168 +++++++-------- R/markers.R | 56 +++-- R/util.R | 32 ++- 4 files changed, 452 insertions(+), 328 deletions(-) diff --git a/R/de.genes.R b/R/de.genes.R index f9c4cbe..df43ff2 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -282,7 +282,7 @@ de_pair_limma <- function(pair, y <- as.character(pair[2]) ctr <- paste(paste0("cl", x), "-", paste0("cl", y)) - + contrasts.matrix <- limma::makeContrasts(contrasts = ctr, levels = design) @@ -305,10 +305,10 @@ de_pair_limma <- function(pair, results <- data.frame(padj = padj, pval = pval, lfc = lfc, - meanA = cl.means[,x], - meanB = cl.means[,y], - q1 = cl.present[,x], - q2 = cl.present[,y]) + meanA = cl.means[[x]], + meanB = cl.means[[y]], + q1 = cl.present[[x]], + q2 = cl.present[[y]]) row.names(results) <- genes @@ -377,49 +377,233 @@ de_pair_chisq <- function(pair, } -#' Perform pairwise differential gene expression tests between main pairs of clusters in parallel -#' -#' @param norm.dat a normalized data matrix for data. -#' @param cl a cluster factor object. -#' @param pairs A 2-column matrix of cluster pairs. -#' @param method Either "limma" or "chisq". -#' @param low.th The minimum expression value used to filter for expressed genes. -#' @param cl.present A matrix of proportions of cells in each cluster with gene detection. Can be generated with \code{get_cl_props()}. Default is NULL (will be generated). -#' @param use.voom Logical, whether or not to use \code{voom()} for \code{limma} calculations. Default is FALSE. -#' @param counts A matrix of raw count data for each cell. Required if \code{use.voom} is TRUE. Default is NULL. -#' @param mc.cores A number indicating how many processor cores to use for parallelization. + +#' Perform pairwise differential detection tests using t.test for a single pair of clusters +#' +#' @param pair a numeric vector of length 2 specifying which clusters to compare +#' @param cl.means a data.frame of normalized mean gene expression values (genes x clusters) +#' @param cl.vars a data.frame of normalized variance gene expression values (genes x clusters) +#' @param cl.size a named numeric vector of cluster sizes +#' @param genes the genes to use for pairwise comparisons +#' +#' @return a data.frame with DE statistics: +#' \itemize{ +#' \item{padj} P-values adjusted using the Holm (1979) method (\code{p.adjust()} default). +#' \item{pval} P-values reported by the \code{vec_chisq_test()} function. +#' \item{lfc} Log fold change of mean expression values between the pair of clusters. +#' \item{meanA} Mean expression value for the first cluster in the pair. +#' \item{meanB} Mean expression value for the second cluster in the pair. +#' \item{q1} Proportion of cells expressing each gene for the first cluster in the pair. +#' \item{q2} Proportion of cells expressing each gene for the second cluster in the pair. +#' } #' -#' @return #' @export -de_selected_pairs <- function(norm.dat, - cl, - pairs, - method = "limma", - low.th = 1, - min.cells = 4, - cl.means = NULL, - cl.present = NULL, +#' +de_pair_t.test <- function(pair, + cl.means, + cl.present, + cl.vars, + cl.size, + genes) { + + + x <- as.character(pair[1]) + y <- as.character(pair[2]) + m1 = cl.means[[x]] + m2 = cl.means[[y]] + v1 = cl.vars[[x]] + v2 = cl.vars[[y]] + n1 = cl.size[[x]] + n2 = cl.size[[y]] + sd = sqrt( v1/n1 + v2/n2) + t.stats = (m1 - m2) / sd + df = sd^4 / ((v1/n1)^2/(n1-1) + (v2/n2)^2/(n2-1)) + pval = pt(abs(t.stats), df, lower.tail=FALSE) * 2 + padj <- p.adjust(pval) + + lfc <- m1 - m2 + # Note: Above depends on the data being log2 scaled already. + # If we change this expectation, we may need a more generalized calculation. + # fc <- cl.means[, x] / cl.means[, y] + # lfc <- log2(fc) + # lfc[is.na(lfc)] <- 0 + + results <- data.frame(padj = padj, + pval = pval, + lfc = lfc, + meanA = m1, + meanB = m2, + q1 = cl.present[,x], + q2 = cl.present[,y]) + + row.names(results) <- genes + + return(results) + +} + + +get_cl_sigma <- function(mat,cl, cl.means=NULL, cl.sqr.means = NULL) + { + cl.size = table(cl) + cl.size = setNames(as.vector(cl.size),names(cl.size)) + if(is.null(cl.means)){ + cl.means = get_cl_means(mat,cl) + } + if(is.null(cl.sqr.means)){ + cl.sqr.means = get_cl_sqr_means(mat,cl, cl.means=cl.means) + } + df = sum(cl.size) - length(cl.size) + sigma = sqrt(colSums( t(cl.sqr.means - cl.means^2) * cl.size[colnames(cl.sqr.means)]) / df) + } + + + +simple_lmFit <- function(norm.dat, cl, cl.means = NULL, cl.sqr.means = NULL) + { + if(is.null(cl.means)){ + cl.means = get_cl_means(norm.dat, cl) + } + if(is.null(cl.sqr.means)){ + cl.sqr.means = get_cl_sqr_means(norm.dat, cl) + } + cl.size = table(cl) + cl.means = cl.means[,names(cl.size)] + cl.sqr.means = cl.sqr.means[,names(cl.size)] + fit = list() + fit$coefficients = cl.means + fit$rank = ncol(cl.means) + fit$df.residual = length(cl) - fit$rank + fit$sigma = get_cl_sigma(norm.dat, cl, cl.means = cl.means, cl.sqr.means= cl.sqr.means) + fit$stdev.unscaled = 1/sqrt(cl.size) + return(fit) + } + + +simple_ebayes <- function(fit,proportion=0.01,stdev.coef.lim=c(0.1,4),trend=FALSE,robust=FALSE,winsor.tail.p=c(0.05,0.1)) +# Empirical Bayes statistics to select differentially expressed genes +# Gordon Smyth +# 8 Sept 2002. Last revised 1 May 2013. +# Made a non-exported function 18 Feb 2018. +{ + coefficients <- fit$coefficients + stdev.unscaled <- fit$stdev.unscaled + sigma <- fit$sigma + df.residual <- fit$df.residual + if(is.null(coefficients) || is.null(stdev.unscaled) || is.null(sigma) || is.null(df.residual)) stop("No data, or argument is not a valid lmFit object") + if(all(df.residual==0)) stop("No residual degrees of freedom in linear model fits") + if(all(!is.finite(sigma))) stop("No finite residual standard deviations") + if(trend) { + covariate <- fit$Amean + if(is.null(covariate)) stop("Need Amean component in fit to estimate trend") + } else { + covariate <- NULL + } + +# Moderated t-statistic + out <- squeezeVar(sigma^2, df.residual, covariate=covariate, robust=robust, winsor.tail.p=winsor.tail.p) + out$s2.prior <- out$var.prior + out$s2.post <- out$var.post + out$var.prior <- out$var.post <- NULL + out$t <- coefficients / stdev.unscaled / sqrt(out$s2.post) + df.total <- df.residual + out$df.prior + df.pooled <- sum(df.residual,na.rm=TRUE) + df.total <- pmin(df.total,df.pooled) + out$df.total <- df.total + out$p.value <- 2*pt(-abs(out$t),df=df.total) + return(out) +} + + +de_pair_fast_limma <- function(pair, + fit, + cl.means, + cl.present, + genes) +{ + x <- as.character(pair[1]) + y <- as.character(pair[2]) + fit2 = fit + coef = fit$coefficients + fit2$coefficients = coef[[x]] - coef[[y]] + stdev.unscaled = fit$stdev.unscaled + fit2$stdev.unscaled = sqrt(sum(stdev.unscaled[c(x,y)]^2)) + + fit2 <- simple_ebayes(fit = fit2) + m1 = cl.means[[x]] + m2 = cl.means[[y]] + + + lfc <- m1 - m2 + pval <- fit2$p.value + padj <- p.adjust(pval) + + # Note: Above depends on the data being log2 scaled already. + # If we change this expectation, we may need a more generalized calculation. + # fc <- cl.means[, x] / cl.means[, y] + # lfc <- log2(fc) + # lfc[is.na(lfc)] <- 0 + + results <- data.frame(padj = padj, + pval = pval, + lfc = lfc, + meanA = m1, + meanB = m2, + q1 = cl.present[[x]], + q2 = cl.present[[y]]) + + row.names(results) <- genes + + return(results) + + } + + + #' Perform pairwise differential gene expression tests between main pairs of clusters in parallel + #' + #' @param norm.dat a normalized data matrix for data. + #' @param cl a cluster factor object. + #' @param pairs A 2-column matrix of cluster pairs. + #' @param method Either "limma" or "chisq". + #' @param low.th The minimum expression value used to filter for expressed genes. + #' @param cl.present A matrix of proportions of cells in each cluster with gene detection. Can be generated with \code{get_cl_props()}. Default is NULL (will be generated). + #' @param use.voom Logical, whether or not to use \code{voom()} for \code{limma} calculations. Default is FALSE. + #' @param counts A matrix of raw count data for each cell. Required if \code{use.voom} is TRUE. Default is NULL. + #' @param mc.cores A number indicating how many processor cores to use for parallelization. + #' + #' @return + #' @export + de_selected_pairs <- function(norm.dat, + cl, + pairs, + de.param = de_parm(), + method = "limma", + cl.means = NULL, + cl.present = NULL, use.voom = FALSE, counts = NULL, mc.cores = 1) { method <- match.arg(method, - choices = c("limma", "chisq")) - + choices = c("limma", "fast_limma", "chisq", "t.test")) + if(use.voom & is.null(counts)) { stop("The use.voom = TRUE parameter requires a raw count matrix via the counts parameter.") } # Sample filtering based on selected clusters select.cl <- unique(c(pairs[,1], pairs[,2])) - cl.size <- table(cl) - select.cl <- intersect(select.cl, names(cl.size)[cl.size >= min.cells]) - - cl <- cl[cl %in% select.cl] - - norm.dat <- norm.dat[, names(cl)] + cl.size = setNames(as.integer(cl.size), names(cl.size)) + select.cl <- intersect(select.cl, names(cl.size)[cl.size >= de.param$min.cells]) + pairs = pairs[pairs[,1]%in% select.cl & pairs[,2] %in% select.cl,] + cl <- cl[cl %in% select.cl] + if(is.factor(cl)){ + cl = droplevels(cl) + } + cl.size = cl.size[select.cl] + # Gene filtering based on low.th and min.cells thresholds # This was removed recently by Zizhen, as this can be computationally expensive # and can cause some inconsistent results based on which pairs are selected. @@ -442,24 +626,23 @@ de_selected_pairs <- function(norm.dat, cl.means <- as.data.frame(cl.means) } - # Set thresholds per gene - if(length(low.th) == 1) { - low.th <- setNames(rep(low.th, nrow(norm.dat)), row.names(norm.dat)) - } # Compute fraction of cells in each cluster with expression >= low.th if(is.null(cl.present)){ - cl.present <- as.data.frame(get_cl_means(norm.dat >= low.th[row.names(norm.dat)], - cl)) + low.th = de.param$low.th + if(length(low.th) == 1) { + low.th <- setNames(rep(low.th, nrow(norm.dat)), row.names(norm.dat)) + } + cl.present <- as.data.frame(get_cl_means(norm.dat >= low.th[row.names(norm.dat)],cl)) } else { cl.present <- as.data.frame(cl.present) } - if(method=="limma"){ + if(method == "limma"){ + norm.dat <- as.matrix(norm.dat[, names(cl)]) cl <- setNames(as.factor(paste0("cl",cl)),names(cl)) design <- model.matrix(~0 + cl) colnames(design) <- levels(as.factor(cl)) - if(use.voom & !is.null(counts)){ v <- limma::voom(counts = as.matrix(counts[row.names(norm.dat), names(cl)]), design = design) @@ -471,62 +654,73 @@ de_selected_pairs <- function(norm.dat, design = design) } } - - if(mc.cores == 1) { - de_list <- list() - - for(i in 1:nrow(pairs)) { - - pair <- paste(pairs[i, 1], pairs[i, 2], sep = "_") + else if (method == "fast_limma"){ + fit = simple_lmFit(norm.dat, cl=cl, cl.means= cl.means) + } + else if (method == "t.test"){ + cl.vars <- as.data.frame(get_cl_vars(norm.dat, cl, cl.means = cl.means)) + } + library(foreach) + library(doParallel) + if (mc.cores == 1) { + registerDoSEQ() + } + else { + cl <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(cl) + on.exit(parallel::stopCluster(cl), add = TRUE) + } + + de_list = pvec(1:nrow(pairs), function(x){ + sapply(x, function(i){ if(method == "limma") { - de_list[[pair]] <- de_pair_limma(pair = pairs[i,], - cl.present = cl.present, - cl.means = cl.means, - design = design, - fit = fit, - genes = row.names(norm.dat)) + df= de_pair_limma(pair = pairs[i,], + cl.present = cl.present, + cl.means = cl.means, + design = design, + fit = fit, + genes = row.names(norm.dat)) + } + else if(method == "fast_limma") { + df= de_pair_fast_limma(pair = pairs[i,], + cl.present = cl.present, + cl.means = cl.means, + fit = fit, + genes = row.names(norm.dat)) + } + else if(method =="t.test"){ + df = de_pair_t.test(pair = pairs[i,], + cl.present = cl.present, + cl.means = cl.means, + cl.vars = cl.vars, + cl.size = cl.size, + genes = row.names(norm.dat)) - } else if(method == "chisq") { - de_list[[pair]] <- de_pair_chisq(pair = pairs[i,], - cl.present = cl.present, - cl.means = cl.means, - cl.size = cl.size, - genes = row.names(norm.dat)) + } + else if (method == "chisq"){ + df = de_pair_chisq(pair = pairs[i,], + cl.present = cl.present, + cl.means = cl.means, + cl.size = cl.size, + genes = row.names(norm.dat)) } - } - } else { - # This needs to be moved to NAMESPACE - library(foreach) - - cluster <- parallel::makeCluster(mc.cores) - doParallel::registerDoParallel(cluster) - - if(method == "limma") { - de_list <- foreach::foreach(i = 1:nrow(pairs), - .combine='c') %dopar% - list(de_pair_limma(pair = pairs[i,], - cl.present = cl.present, - cl.means = cl.means, - design = design, - fit = fit, - genes = row.names(norm.dat))) - } else if(method == "chisq") { - de_list <- foreach::foreach(i = 1:nrow(pairs), - .combine='c') %dopar% - list(de_pair_chisq(pair = pairs[i,], - cl.present = cl.present, - cl.means = cl.means, - cl.size = cl.size, - genes = row.names(norm.dat))) + if(!is.null(de.param$min.cells)) { + cl.size1 <- cl.size[as.character(pairs[i, 1])] + cl.size2 <- cl.size[as.character(pairs[i, 2])] + } else { + cl.size1 <- NULL + cl.size2 <- NULL + } + + stats= de_stats_pair(df, + de.param = de.param, + cl.size1, + cl.size2) + },simplify=F) + },mc.cores=mc.cores) - } - - parallel::stopCluster(cluster) - - names(de_list) <- paste(pairs[,1],pairs[,2],sep="_") - } - + names(de_list) <- paste(pairs[,1],pairs[,2],sep="_") return(de_list) } @@ -553,6 +747,7 @@ de_all_pairs <- function(norm.dat, cn <- as.character(sort(unique(cl))) pairs = create_pairs(cn) + de_selected_pairs(norm.dat = norm.dat, cl = cl, pairs = pairs, @@ -612,8 +807,8 @@ de_stats_pair <- function(df, de.param = de_param(), cl.size1 = NULL, cl.size2 = NULL, - select.genes = NULL) { - + select.genes = NULL, + return.df = FALSE) { df <- df[order(df$pval, -abs(df$lfc)), ] select <- with(df, which(padj < de.param$padj.th & abs(lfc) > de.param$lfc.th)) @@ -640,14 +835,11 @@ de_stats_pair <- function(df, if(!is.null(de.param$q1.th)) { up <- with(df[up, , drop = FALSE], up[q1 > de.param$q1.th]) - if(!is.null(cl.size1)){ up <- with(df[up, , drop = FALSE], up[q1 * cl.size1 >= de.param$min.cells]) - } down <- with(df[down, , drop = FALSE], down[q2 > de.param$q1.th]) - if(!is.null(cl.size2)) { down <- with(df[down, , drop = FALSE], down[q2 * cl.size2 >= de.param$min.cells]) } @@ -676,122 +868,19 @@ de_stats_pair <- function(df, if(length(up) == 0) { up.score <- 0 } if(length(down) == 0) { down.score <- 0 } - list(score = up.score + down.score, + result=list(score = up.score + down.score, up.score = up.score, down.score = down.score, num = length(select), up.num = length(up), down.num = length(down), - genes = select, - up.genes = up, - down.genes = down, - de.df = df[select, ]) - } - -} - - -#' Compute differential expression summary statistics for selected pairs of clusters based on de_param(). -#' -#' @param norm.dat a normalized data matrix for data. -#' @param cl a cluster factor object. -#' @param pairs A 2-column matrix of cluster pairs. -#' @param de.df Optional. Pre-computed results from \code{de_selected_pairs()} using the same pairs. Default = NULL. -#' @param de.param A list of differential gene expression parameters from \code{de_param()} -#' @param method If de.df is NULL, use "limma" or "chisq" to compute differentially expressed genes. -#' @param mc.cores If de.df is NULL, number of cores to use for parallel computation. -#' -#' @return A list with two objects: -#' \itemize{ -#' \item{de.df} A list of results from \code{de_selected_pairs()} for each pair. -#' \item{de.genes} A list of results from \code{de_stats_pair()} for each pair. -#' } -#' @export -#' -de_stats_selected_pairs <- function(norm.dat, - cl, - pairs, - de.df = NULL, - de.param = de_param(), - method = "limma", - select.genes = NULL, - mc.cores = 1, - cl.means = NULL, - cl.present = NULL) { - - # Filter data for only the provided pairs - row.names(pairs) <- paste(pairs[, 1], pairs[, 2], sep = "_") - - select.cl <- unique(c(pairs[, 1],pairs[, 2])) - cl <- cl[cl %in% select.cl] - - norm.dat <- as.matrix(norm.dat[, names(cl)]) - - if(is.factor(cl)) { cl <- droplevels(cl) } - - # Filter pairs for clusters larger than min.cells - cl.size <- table(cl) - cl.n <- names(cl.size) - - cl.small <- cl.n[cl.size < de.param$min.cells] - cl.big <- setdiff(cl.n,cl.small) - - select.pair <- pairs[, 1] %in% cl.big & pairs[, 2] %in% cl.big - - de.genes <- list() - - if(sum(select.pair) > 0) { - - cl <- cl[cl %in% c(pairs[select.pair, 1], pairs[select.pair, 2])] - select.cells <- names(cl) - low.th <- de.param$low.th - - if(length(low.th) == 1){ - low.th <- setNames(rep(low.th, nrow(norm.dat)), - row.names(norm.dat)) - } - - if(is.null(de.df)) { - de.df <- de_selected_pairs(norm.dat, - cl[select.cells], - pairs[select.pair, , drop = FALSE], - low.th = low.th, - min.cells = de.param$min.cells, - method = method, - mc.cores = mc.cores, - cl.means = cl.means, - cl.present = cl.present) + up.genes = setNames(df[up,"padj"], up), + down.genes = setNames(df[down,"padj"], down)) + if(return.df){ + result$de.df = df[select,] } - - de.genes <- sapply(names(de.df), - function(x) { - if(is.null(de.df[[x]])){ - return(list()) - } - - df = de.df[[x]] - if(!is.null(de.param$min.cells)) { - cl.size1 <- cl.size[as.character(pairs[x, 1])] - cl.size2 <- cl.size[as.character(pairs[x, 2])] - } else { - cl.size1 <- NULL - cl.size2 <- NULL - } - de_stats_pair(df, - de.param = de.param, - cl.size1, - cl.size2, - select.genes = select.genes) - }, - simplify = FALSE) - } - - for(i in which(!select.pair)) { - pair <- paste(pairs[i, 1], pairs[i, 2], sep = "_") - de.genes[[pair]] <- list() - } - ###Not returning de.df anymore to save memory - return(de.genes) + return(result) + } } @@ -812,12 +901,7 @@ de_stats_all_pairs <- function(norm.dat, de.param = de_param(), method = "limma", de.genes = NULL, - ...) { - - if(is.factor(cl)){ - cl <- droplevels(cl) - } - + ...) { cn <- as.character(sort(unique(cl))) pairs= create_pairs(cn) @@ -826,13 +910,13 @@ de_stats_all_pairs <- function(norm.dat, } else { missing_pairs <- pairs } - - de.genes <- c(de.genes, de_stats_selected_pairs(norm.dat, - cl = cl, - pairs = missing_pairs, - de.param = de.param, - method = method, - ...)) + + de.genes <- c(de.genes, de_selected_pairs(norm.dat, + cl = cl, + pairs = missing_pairs, + de.param = de.param, + method = method, + ...)) return(de.genes) } diff --git a/R/find_noise_cl.R b/R/find_noise_cl.R index 914c2d6..5b3b1d3 100644 --- a/R/find_noise_cl.R +++ b/R/find_noise_cl.R @@ -107,16 +107,16 @@ find_doublet <- function(cl.df, cl.sim, cl.good, de.genes=NULL) cl1= row.names(nn.df)[i] cl2=as.character(nn.df$nn.cl[i]) de = get_de_pair(de.genes, cl1, cl2) - up.genes = head(de$up.genes, 50) + up.genes = head(de$names(up.genes), 50) nn.df$up.genes[i] = length(up.genes) - nn.df$up.genes.score[i] = get_de_score(de$de.df, up.genes) + nn.df$up.genes.score[i] = sum(-log10(de$up.genes[up.genes])) up.genes.olap =sapply( setdiff(cl.good, c(cl1,cl2)), function(k){ p = paste0(k,"_",cl2) tmp.de = get_de_pair(de.genes, k, cl2) - olap.genes= intersect(tmp.de$up.genes, up.genes) + olap.genes= intersect(names(tmp.de$up.genes), up.genes) olap.num = length(olap.genes) - olap.score= get_de_score(de$de.df, olap.genes) + olap.score= sum(-log10(de$up.genes[olap.genes])) c(olap.num, olap.score) }) cl3 = names(which.max(up.genes.olap[1,])) @@ -126,12 +126,12 @@ find_doublet <- function(cl.df, cl.sim, cl.good, de.genes=NULL) nn.df$max.olap.ratio1[i] = up.genes.olap[2,cl3]/nn.df$up.genes.score[i] de1 = get_de_pair(de.genes, cl1, cl3) - up.genes = head(de1$up.genes, 50) - up.gene.score= get_de_score(de1$de.df, up.genes) + up.genes = head(names(de1$up.genes), 50) + up.gene.score= sum(-log10(de1$up.genes[up.genes])) de2 = get_de_pair(de.genes, cl2, cl3) - olap.genes = intersect(de2$up.genes, up.genes) + olap.genes = intersect(names(de2$up.genes), up.genes) nn.df$max.olap.genes2[i] = length(olap.genes) - nn.df$max.olap.score2[i] = get_de_score(de1$de.df, olap.genes) + nn.df$max.olap.score2[i] = sum(-log10(de1$up.genes[olap.genes])) nn.df$max.olap.ratio2[i] = nn.df$max.olap.score2[i]/ up.gene.score } nn.df$max.olap.cl_label = cl.df[as.character(nn.df$max.olap.cl),"cluster_label"] @@ -154,10 +154,10 @@ find_doublet <- function(cl.df, cl.sim, cl.good, de.genes=NULL) #' @examples plot_doublet <- function(norm.dat, cl, doublet.df, de.genes, all.col) { - for(i in 1:nrow(doublets.df)){ - x = as.character(doublets.df[i, "cl"]) - y = as.character(doublets.df[i, "cl1"]) - z = as.character(doublets.df[i, "cl2"]) + for(i in 1:nrow(doublet.df)){ + x = as.character(doublet.df[i, "cl"]) + y = as.character(doublet.df[i, "cl1"]) + z = as.character(doublet.df[i, "cl2"]) tmp.cl = cl[cl %in% c(x, y, z)] tmp.cl = setNames(factor(as.character(tmp.cl), c(x,y,z)), names(tmp.cl)) tmp=display_cl(tmp.cl, norm.dat, prefix=paste0("doublet.",paste(levels(tmp.cl), collapse="_")), col=all.col, max.cl.size=100, de.genes=de.genes) @@ -288,81 +288,81 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) if(is.null(de.genes)){ stop("Need to specify de.genes") } - require(foreach) - require(doParallel) - if (mc.cores == 1) { - registerDoSEQ() - } - else { - cores <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(cores) - on.exit(parallel::stopCluster(cores), add = TRUE) - } - result.list= foreach(p=names(de.genes), .combine='list',.multicombine=TRUE, .maxcombine=length(de.genes)) %dopar% { - #result.list= sapply(names(de.genes), function(p){ - #print(p) - de = de.genes[[p]] - if(de$up.num < min.genes | de$down.num < min.genes){ - return(NULL) - } - tmp=strsplit(p,"_")[[1]] - cl1 = tmp[[1]] - cl2 = tmp[[2]] - - up.genes = head(de$up.genes, 50) - down.genes = head(de$down.genes,50) - - up.genes.score = get_de_score(de$de.df, up.genes) - down.genes.score = get_de_score(de$de.df, down.genes) - - results = sapply(setdiff(as.character(cl),c(cl1,cl2)), function(cl3){ - tmp1.de = get_de_pair(de.genes, cl1, cl3) - tmp2.de = get_de_pair(de.genes, cl3, cl2) - - olap.up.genes1 = intersect(tmp2.de$up.genes, up.genes) - olap.up.num1 = length(olap.up.genes1) - olap.up.score1 = get_de_score(de$de.df, olap.up.genes1) - olap.up.ratio1 = olap.up.score1 / up.genes.score - - olap.down.genes1 = intersect(tmp1.de$down.genes, down.genes) - olap.down.num1 = length(olap.down.genes1) - olap.down.score1 = get_de_score(de$de.df, olap.down.genes1) - olap.down.ratio1 = olap.down.score1 / down.genes.score - - up.genes2 = head(tmp1.de$up.genes, 50) - up.genes.score2 = get_de_score(tmp1.de$de.df, up.genes2) - olap.up.genes2 = intersect(up.genes2,de$up.genes) - olap.up.num2 = length(olap.up.genes2) - olap.up.score2 = get_de_score(tmp1.de$de.df, olap.up.genes2) - olap.up.ratio2 = olap.up.score2 /up.genes.score2 + #require(foreach) + #require(doParallel) + #if (mc.cores == 1) { + # registerDoSEQ() + #} + #else { + # cores <- makeForkCluster(mc.cores) + # doParallel::registerDoParallel(cores) + # on.exit(parallel::stopCluster(cores), add = TRUE) + #} + result.list= pvec(names(de.genes), function(pairs){ + result.list= sapply(pairs, function(p){ + #print(p) + de = de.genes[[p]] + if(de$up.num < min.genes | de$down.num < min.genes){ + return(NULL) + } + tmp=strsplit(p,"_")[[1]] + cl1 = tmp[[1]] + cl2 = tmp[[2]] - - down.genes2 = head(tmp2.de$down.genes, 50) - down.genes.score2 = get_de_score(tmp2.de$de.df, down.genes2) - olap.down.genes2 = intersect(down.genes2,de$down.genes) - olap.down.num2 = length(olap.down.genes2) - olap.down.score2 = get_de_score(tmp2.de$de.df, olap.down.genes2) - olap.down.ratio2 = olap.down.score2 /down.genes.score2 + up.genes = head(names(de$up.genes), 50) + down.genes = head(names(de$down.genes),50) + + up.genes.score = sum(-log10(de$up.genes[up.genes])) + down.genes.score = sum(-log10(de$down.genes[down.genes])) - result = list( - cl1=cl1, - cl2=cl2, - up.num = length(up.genes), - down.num = length(down.genes), - olap.num=c(olap.up.num1, olap.down.num1, olap.up.num2, olap.down.num2), - olap.ratio = c(olap.up.ratio1, olap.down.ratio1, olap.up.ratio2, olap.down.ratio2), - olap.score = c(olap.up.score1, olap.down.score1, olap.up.score2, olap.down.score2) - ) - result$score = sum(result$olap.score) / sum(c(up.genes.score, down.genes.score, up.genes.score2, down.genes.score2)) - return(result) + results = sapply(setdiff(as.character(cl),c(cl1,cl2)), function(cl3){ + tmp1.de = get_de_pair(de.genes, cl1, cl3) + tmp2.de = get_de_pair(de.genes, cl3, cl2) + + olap.up.genes1 = intersect(names(tmp2.de$up.genes), up.genes) + olap.up.num1 = length(olap.up.genes1) + olap.up.score1 = sum(-log10(de$up.genes[olap.up.genes1])) + olap.up.ratio1 = olap.up.score1 / up.genes.score + + olap.down.genes1 = intersect(names(tmp1.de$down.genes), down.genes) + olap.down.num1 = length(olap.down.genes1) + olap.down.score1 = sum(-log10(de$down.genes[olap.down.genes1])) + olap.down.ratio1 = olap.down.score1 / down.genes.score + + up.genes2 = head(names(tmp1.de$up.genes), 50) + up.genes.score2 = sum(-log10(tmp1.de$up.genes[up.genes2])) + olap.up.genes2 = intersect(names(up.genes2),de$up.genes) + olap.up.num2 = length(olap.up.genes2) + olap.up.score2 = sum(-log10(tmp1.de$up.genes[olap.up.genes2])) + olap.up.ratio2 = olap.up.score2 /up.genes.score2 + + + down.genes2 = head(names(tmp2.de$down.genes), 50) + down.genes.score2 = sum(-log10(tmp2.de$down.genes[down.genes2])) + olap.down.genes2 = intersect(down.genes2,names(de$down.genes)) + olap.down.num2 = length(olap.down.genes2) + olap.down.score2 = sum(-log10(tmp2.de$down.genes[olap.down.genes2])) + olap.down.ratio2 = olap.down.score2 /down.genes.score2 + + result = list( + cl1=cl1, + cl2=cl2, + up.num = length(up.genes), + down.num = length(down.genes), + olap.num=c(olap.up.num1, olap.down.num1, olap.up.num2, olap.down.num2), + olap.ratio = c(olap.up.ratio1, olap.down.ratio1, olap.up.ratio2, olap.down.ratio2), + olap.score = c(olap.up.score1, olap.down.score1, olap.up.score2, olap.down.score2) + ) + result$score = sum(result$olap.score) / sum(c(up.genes.score, down.genes.score, up.genes.score2, down.genes.score2)) + return(result) + },simplify=F) + test.score=sapply(results, function(x)x$score) + tmp = names(which.max(test.score)) + result = results[[tmp]] + result$cl = tmp + return(result) },simplify=F) - test.score=sapply(results, function(x)x$score) - tmp = names(which.max(test.score)) - result = results[[tmp]] - result$cl = tmp - return(result) - #},simplify=F) - } + },mc.cores=mc.cores) names(result.list) = names(de.genes) result.list = result.list[!sapply(result.list, is.null)] cl = sapply(result.list, function(x)x$cl) diff --git a/R/markers.R b/R/markers.R index 8e726d9..32127c3 100644 --- a/R/markers.R +++ b/R/markers.R @@ -10,6 +10,8 @@ #' @export #' #' @examples + + select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) { if(is.null(de.genes)){ @@ -17,11 +19,14 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) } pairs = names(de.genes) pairs.df = gsub("cl","", do.call("rbind",strsplit(pairs, "_"))) + + + row.names(pairs.df)=pairs select.pairs = pairs[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] de.markers = sapply(select.pairs, function(s){ tmp = de.genes[[s]] - c(head(tmp$up.genes,n.markers), head(tmp$down.genes,n.markers)) + c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) },simplify=F) markers = intersect(unlist(de.markers),row.names(norm.dat)) return(list(markers=markers, de.genes=de.genes[select.pairs])) @@ -38,26 +43,31 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) #' @export #' #' @examples -get_gene_score <- function(de.genes,top.n=50, max.num=1000,bin.th=4) +get_gene_score <- function(de.genes,cl.means, top.n=50, max.num=1000,bin.th=4) { - select.genes <- sapply(de.genes, function(x){ - up.genes = x$up.genes + select.genes <- sapply(names(de.genes), function(p){ + de = de.genes[[p]] + pair = strsplit(p, "_") + x = pair[[1]] + y = pair[[2]] + lfc = cl.means[,x] - cl.means[,y] + up.genes = names(de$up.genes) #Deal with pairs with too many DEX genes, include all binary markers - up.binary.genes = up.genes[x$q.stats[up.genes, 3] < 1 & x$q.stats[up.genes,2]>bin.th] + up.binary.genes = up.genes[lfc[up.genes] > bin.th] up.genes=up.genes[up.genes %in% c(head(up.genes, top.n), up.binary.genes)] - down.genes = x$down.genes - down.binary.genes = down.genes[x$q.stats[down.genes, 1] < 1 & x$q.stats[down.genes,4]>bin.th] + down.genes = de$down.genes + down.binary.genes = down.genes[lfc[down.genes] < -bin.th] down.genes=down.genes[down.genes %in% c(head(down.genes, top.n), down.binary.genes)] list(up=up.genes, down=down.genes) },simplify=F) all.genes=unique(unlist(select.genes)) up.gene.score = sapply(select.genes, function(x){ - tmp=match(all.genes, x$up) + tmp=match(all.genes, de$up) tmp[is.na(tmp)]=max.num tmp }) down.gene.score = sapply(select.genes, function(x){ - tmp=match(all.genes, x$down) + tmp=match(all.genes, de$down) tmp[is.na(tmp)]=max.num tmp }) @@ -80,14 +90,14 @@ get_gene_score <- function(de.genes,top.n=50, max.num=1000,bin.th=4) #' @export #' #' @examples -select_markers_pair <- function(de.genes, add.genes, gene.score=NULL,rm.genes=NULL,top.n=50,max.num=2000) +select_markers_pair <- function(de.genes, add.genes, cl.means, gene.score=NULL,rm.genes=NULL,top.n=50,max.num=2000) { pairs =do.call("rbind",strsplit(gsub("cl","",names(add.genes)), "_")) row.names(pairs)= names(add.genes) de.genes.list=list() if(is.null(gene.score)){ de.genes= de.genes[names(add.genes)] - tmp=get_gene_score(de.genes,top.n=top.n, max.num=max.num,bin.th=4) + tmp=get_gene_score(de.genes,cl.means=cl.means, top.n=top.n, max.num=max.num,bin.th=4) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score gene.score=pmin(up.gene.score, down.gene.score) @@ -126,7 +136,7 @@ select_markers_pair <- function(de.genes, add.genes, gene.score=NULL,rm.genes=NU #' @export #' #' @examples -select_markers_pair_direction <- function(de.genes, add.up,add.down,up.gene.score=NULL,down.gene.score=NULL,rm.genes=NULL,top.n=50,max.num=2000) +select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up.gene.score=NULL,down.gene.score=NULL,rm.genes=NULL,top.n=50,max.num=2000) { up.genes = down.genes=list() final.genes=c() @@ -135,7 +145,7 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,up.gene.scor pairs =do.call("rbind",strsplit(gsub("cl","",pairs.n), "_")) row.names(pairs)= pairs.n de.genes= de.genes[pairs.n] - tmp=get_gene_score(de.genes,top.n=top.n, max.num=max.num,bin.th=4) + tmp=get_gene_score(de.genes,cl.means, top.n=top.n, max.num=max.num,bin.th=4) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score } @@ -198,7 +208,7 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,up.gene.scor #' @export #' #' @examples -select_markers_pair_group <- function(cl, g1,g2,de.genes,top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) +select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) { pairs = do.call("rbind",strsplit(names(de.genes), "_")) pairs = gsub("cl", "",pairs) @@ -207,7 +217,7 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,top.n=50,max.num=1000,n down.pairs = row.names(pairs)[pairs[,1] %in% g2 & pairs[,2] %in% g1] select.pairs = c(up.pairs, down.pairs) if(is.null(up.gene.score)){ - tmp=get_gene_score(de.genes[select.pairs],top.n=top.n, max.num=max.num,bin.th=4) + tmp=get_gene_score(de.genes[select.pairs],cl.means=cl.means, top.n=top.n, max.num=max.num,bin.th=4) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score } @@ -251,19 +261,19 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,top.n=50,max.num=1000,n #' @export #' #' @examples -select_N_markers <- function(de.genes, up.gene.score=NULL, down.gene.score=NULL, default.markers=NULL, pair.num =1, add.up=pair.num, add.down=pair.num, rm.genes=NULL, pairs=names(de.genes)) +select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.score=NULL, default.markers=NULL, pair.num =1, add.up=pair.num, add.down=pair.num, rm.genes=NULL, pairs=names(de.genes)) { add.up = setNames(rep(add.up, length(pairs)), pairs) add.down= setNames(rep(add.down, length(pairs)), pairs) if(!is.null(default.markers)){ - up.default = sapply(pairs, function(p){intersect(de.genes[[p]]$up.genes, default.markers)},simplify=F) - down.default = sapply(pairs, function(p){intersect(de.genes[[p]]$down.genes, default.markers)},simplify=F) + up.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) + down.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) add.up = pmax(add.up - sapply(up.default, length),0) add.down = pmax(add.down - sapply(down.default, length),0) } add.up = add.up[add.up>0, drop=F] add.down = add.down[add.down>0, drop=F] - result = select_markers_pair_direction(add.up,add.down,de.genes=de.genes, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers),top.n=50,max.num=2000) + result = select_markers_pair_direction(add.up,add.down,de.genes=de.genes, cl.means=cl.means,up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers),top.n=50,max.num=2000) up.genes = up.default down.genes=down.default for(x in names(result$up.genes)){ @@ -291,7 +301,7 @@ select_N_markers <- function(de.genes, up.gene.score=NULL, down.gene.score=NULL, #' @export #' #' @examples -select_pos_markers <- function(de.genes, cl, n.markers=3, default.markers=NULL, rm.genes=NULL, up.gene.score=NULL, down.gene.score=NULL) +select_pos_markers <- function(de.genes, cl, cl.means, n.markers=3, default.markers=NULL, rm.genes=NULL, up.gene.score=NULL, down.gene.score=NULL) { pairs = names(de.genes) pairs.df = as.data.frame(do.call("rbind", strsplit(pairs, "_"))) @@ -311,15 +321,15 @@ select_pos_markers <- function(de.genes, cl, n.markers=3, default.markers=NULL, add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) add.down = setNames(rep(n.markers, length(down.pairs)), down.pairs) - up.default = sapply(up.pairs, function(p){intersect(de.genes[[p]]$up.genes, default.markers)},simplify=F) - down.default = sapply(down.pairs, function(p){intersect(de.genes[[p]]$down.genes, default.markers)},simplify=F) + up.default = sapply(up.pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) + down.default = sapply(down.pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) if(length(up.default)>0){ add.up = pmax(add.up - sapply(up.default, length),0) } if(length(down.default)>0){ add.down = pmax(add.down - sapply(down.default, length),0) } - tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) + tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, cl.means=cl.means, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) unique(c(tmp.result$markers, unlist(up.default), unlist(down.default))) },simplify=F) diff --git a/R/util.R b/R/util.R index 3b36eff..140d3de 100644 --- a/R/util.R +++ b/R/util.R @@ -262,7 +262,7 @@ get_cl_sums <- function(mat, cl.sums <- Matrix::tcrossprod(mat[,rownames(cl.mat)], Matrix::t(cl.mat)) } else{ - cl.sums <- Matrix::crossprod(mat[rownames(cl.mat),], cl.mat) + cl.sums <- Matrix::crossprod(mat[,rownames(cl.mat)], cl.mat) } cl.sums <- as.matrix(cl.sums) return(cl.sums) @@ -288,6 +288,36 @@ get_cl_means <- function(mat, return(cl.means) } + + +get_cl_sqr_means<- function(mat, cl) + { + tmp = mat + if(is.matrix(tmp)){ + tmp = tmp^2 + } + else{ + tmp@x = tmp@x^2 + } + cl.sqr = get_cl_means(tmp,cl) + } + + +get_cl_vars <- function(mat, + cl, cl.means=NULL, cl.sqr.means = NULL) { + + if(is.null(cl.means)){ + cl.means = get_cl_means(mat,cl) + } + if(is.null(cl.sqr.means)){ + cl.sqr.means = get_cl_sqr_means(tmat,cl) + } + cl.vars = cl.sqr.means - cl.means^2 + cl.size = as.vector(table(cl)[colnames(cl.vars)]) + cl.vars = t(t(cl.vars) * cl.size/(cl.size - 1)) + return(cl.vars) +} + #' Compute cluster medians for each row in a matrix #' #' @param mat A gene (rows) x samples (columns) sparse matrix From 33be36eafc943f606a71e3f783ab606befceff41 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Sun, 31 May 2020 15:54:14 -0700 Subject: [PATCH 02/70] Propagate the updates for de_genes --- R/de.genes.R | 92 +++++++++++++++------------------------------ R/harmonize_merge.R | 87 +++++++++++++++++++++++++++--------------- R/harmonize_util.R | 38 +++++++++++++++++++ R/markers.R | 2 +- R/merge_cl.R | 4 +- 5 files changed, 129 insertions(+), 94 deletions(-) diff --git a/R/de.genes.R b/R/de.genes.R index df43ff2..bfa1758 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -6,9 +6,7 @@ # # vec_chisq_test() # -# score_pair_limma() Tests for one pair of clusters # -# score_pair_chisq() Tests for one pair of clusters # vec_chisq_test() de.genes.R # # de_selected_pairs() Tests for multiple pairs of clusters. Was DE_genes_pairs(). @@ -16,16 +14,11 @@ # score_pair_limma() de.genes.R # score_pair_chisq() de.genes.R # -# de_all_pairs() Tests for every pair of clusters. Was DE_genes_pw(). -# DE_genes_pairs() de.genes.R # # compute_pair_deScore() Compute deScores based on score_pair_X() results and de_param(). Was de_pairs(). # -# de_score() -# de_score_pairs() de.genes.R # -# de_score_pairs() -# DE_genes_pairs de.genes.R + # # get_de_matrix() # get_pairs() de.genes.R @@ -580,10 +573,12 @@ de_pair_fast_limma <- function(pair, method = "limma", cl.means = NULL, cl.present = NULL, - use.voom = FALSE, - counts = NULL, - mc.cores = 1) { - + cl.sq.means = NULL, + use.voom = FALSE, + counts = NULL, + mc.cores = 1, + return.df = FALSE) { + method <- match.arg(method, choices = c("limma", "fast_limma", "chisq", "t.test")) @@ -655,7 +650,7 @@ de_pair_fast_limma <- function(pair, } } else if (method == "fast_limma"){ - fit = simple_lmFit(norm.dat, cl=cl, cl.means= cl.means) + fit = simple_lmFit(norm.dat, cl=cl, cl.means= cl.means, cl.sqr.means= cl.sqr.means) } else if (method == "t.test"){ cl.vars <- as.data.frame(get_cl_vars(norm.dat, cl, cl.means = cl.means)) @@ -716,7 +711,8 @@ de_pair_fast_limma <- function(pair, stats= de_stats_pair(df, de.param = de.param, cl.size1, - cl.size2) + cl.size2, + return.df = return.df) },simplify=F) },mc.cores=mc.cores) @@ -724,37 +720,6 @@ de_pair_fast_limma <- function(pair, return(de_list) } -####Make sure dat and cl has the same dimension, and cells are in the same order - -#' Perform all pairwise differential expression comparison between clusters -#' -#' @param norm.dat a normalized data matrix for data. -#' @param cl a cluster factor object. -#' @param ... Additional parameters passed to DE_genes_pairs() -#' -#' @seealso \link{DE_genes_pairs} -#' -#' @return a list containing DE results for every pair of clusters -#' -#' @export -de_all_pairs <- function(norm.dat, - cl, - ...) { - - if(sum(names(cl) %in% colnames(norm.dat)) != length(cl)) { - stop("Missing data for some cells in cl.") - } - - cn <- as.character(sort(unique(cl))) - pairs = create_pairs(cn) - - de_selected_pairs(norm.dat = norm.dat, - cl = cl, - pairs = pairs, - ...) - -} - # Add docs and implement within functions #' Title @@ -860,22 +825,27 @@ de_stats_pair <- function(df, if(length(select) == 0){ return(list()) } else { + + up.genes = setNames(-log10(df[up,"padj"]), up) + down.genes = setNames(-log10(df[down,"padj"]), down) - df$padj[df$padj < 1e-20] <- 1e-20 - up.score <- sum(-log10(df[up,"padj"])) - down.score <- sum(-log10(df[down,"padj"])) - - if(length(up) == 0) { up.score <- 0 } - if(length(down) == 0) { down.score <- 0 } - - result=list(score = up.score + down.score, - up.score = up.score, - down.score = down.score, - num = length(select), - up.num = length(up), - down.num = length(down), - up.genes = setNames(df[up,"padj"], up), - down.genes = setNames(df[down,"padj"], down)) + tmp = up.genes + tmp[tmp > 20] = 20 + up.score <- sum(tmp) + tmp = down.genes + tmp[tmp > 20] = 20 + down.score <- sum(down) + + result=list( + up.score = up.score, + down.score = down.score, + score = up.score + down.score, + up.num = length(up.genes), + down.num = length(down.genes), + num = up.num + down.num + ) + + if(return.df){ result$de.df = df[select,] } @@ -896,7 +866,7 @@ de_stats_pair <- function(df, #' @return a character vector of all differentially expressed genes. #' @export #' -de_stats_all_pairs <- function(norm.dat, +de_all_pairs <- function(norm.dat, cl, de.param = de_param(), method = "limma", diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index dc7159c..8e13954 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -14,10 +14,9 @@ #' @export #' #' @examples -de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means.list=NULL, cl.present.list=NULL, lfc.conservation.th=0.6, de.genes.list=NULL, max.cl.size=200) +de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means.list=NULL, cl.present.list=NULL, cl.sqr.means.list=NULL, lfc.conservation.th=0.6, de.genes.list=NULL, max.cl.size=200, method="fast_limma") { cl.size = table(cl) - de.df.list = sapply(names(dat.list), function(x)list()) if(is.null(de.genes.list)){ de.genes.list = sapply(names(dat.list), function(x)list()) } @@ -29,7 +28,6 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means cl.size.platform[[x]]= cl.size select.cl = names(cl.size)[cl.size >= de.param.list[[x]]$min.cells] if(length(select.cl) < 2){ - de.df.list[[x]] = NULL next } tmp.cl = tmp.cl[tmp.cl %in% select.cl] @@ -42,45 +40,55 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means } tmp.pairs= pairs[pairs[,1] %in% select.cl & pairs[,2] %in% select.cl,] if(nrow(tmp.pairs)==0){ - de.df.list[[x]] = NULL next - } - tmp.de.df = DE_genes_pairs(norm.dat, cl= tmp.cl, pairs = tmp.pairs, low.th= de.param.list[[x]]$low.th, min.cells = de.param.list[[x]]$min.cells, cl.means=cl.means.list[[x]], cl.present = cl.present.list[[x]]) - de.df.list[[x]] = tmp.de.df - } + } + de.genes.list[[x]] = c(de.genes.list[[x]], de_selected_pairs(norm.dat, cl= tmp.cl, pairs = tmp.pairs, de.param=de.param, method=method,cl.means=cl.means.list[[x]], cl.present = cl.present.list[[x]], cl.sqr.means=cl.sqr.means.list[[x]])) + } for(p in row.names(pairs)){ - lfc = do.call("cbind",lapply(names(de.df.list), function(x){ - if(is.null(de.df.list[[x]][[p]])){ - return(NULL) + lfc = sapply(names(cl.means.list), function(x){ + if(pairs[p,1] %in% colnames(cl.means.list[[x]]) & pairs[p,2] %in% colnames(cl.means.list[[x]])){ + cl.means.list[[x]][comb.dat$common.genes,pairs[p,1]] - cl.means.list[[x]][comb.dat$common.genes,pairs[p,2]] } - df = de.df.list[[x]][[p]] - df[comb.dat$common.genes,"lfc"] - })) - if(is.null(lfc)){ - next - } + else{ + NULL + } + }) + lfc = as.matrix(lfc) row.names(lfc) = comb.dat$common.genes sign1 = rowSums(lfc > 1) sign2 = rowSums(lfc < -1) frac = pmax(sign1, sign2)/ncol(lfc) select.genes = names(frac)[frac >= lfc.conservation.th] for(x in names(de.genes.list)){ - df = de.df.list[[x]][[p]] - if(is.null(df)){ - de.genes.list[[x]][[p]] = list() - } - else{ - cl.size1 = cl.size.platform[[x]][as.character(pairs[p,1])] - cl.size2 = cl.size.platform[[x]][as.character(pairs[p,2])] - de.genes.list[[x]][[p]] = de_pair(df, de.param = de.param.list[[x]], cl.size1=cl.size1, cl.size2 = cl.size2, select.genes= select.genes) + if(is.null(de.genes.list[[x]][[p]])){ + next } + up.genes = de.genes.list[[p]]$up.genes + down.genes = de.genes.list[[p]]$down.genes + up.genes = up.genes[names(up.genes) %in% select.genes] + down.genes = down.genes[names(down.genes) %in% select.genes] + tmp = up.genes + tmp[tmp > 20] = 20 + up.score <- sum(tmp) + tmp = down.genes + tmp[tmp > 20] = 20 + down.score <- sum(down) + + de.genes.list[[x]][[p]]=list( + up.score = up.score, + down.score = down.score, + score = up.score + down.score, + up.num = length(up.genes), + down.num = length(down.genes), + num = up.num + down.num + ) + } } return(de.genes.list) } - #' Title #' #' @param cl.rd @@ -149,7 +157,7 @@ get_cl_sim_multiple <- function(cl.rd.list, FUN =pmax) #' @export #' #' @examples -merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbose=TRUE, pairBatch=40, de.genes.list=NULL, lfc.conservation.th=0.7, merge.type="undirectional") +merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbose=TRUE, pairBatch=40, de.genes.list=NULL, lfc.conservation.th=0.7, merge.type="undirectional", de.method="fast_limma") { print("merge_cl_multiple") cl = setNames(as.character(cl),names(cl)) @@ -186,9 +194,23 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.means.list[[set]] = data.frame(tmp.means) colnames(cl.means.list[[set]])=y } - } - + } + } + if(!is.null(cl.sqr.means.list) & de.method=="fast_limma"){ + tmp = colnames(cl.sqr.means.list[[set]])!=x + cl.sqr.means.list[[set]] = cl.sqr.means.list[[set]][,tmp,drop=F] + tmp.sqr.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]^2) + if(include.y){ + if(!is.null(cl.sqr.means.list[[set]]) & nrow(cl.sqr.means.list[[set]])>0){ + cl.sqr.means.list[[set]][[y]] = tmp.sqr.means[row.names(cl.sqr.means.list[[set]])] + } + else{ + cl.sqr.means.list[[set]] = data.frame(tmp.means) + colnames(cl.sqr.means.list[[set]])=y + } + } } + if(!is.null(cl.present.list)){ tmp = colnames(cl.present.list[[set]])!=x cl.present.list[[set]] = cl.present.list[[set]][,tmp,drop=F] @@ -232,7 +254,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if(verbose){ print("Add de genes") } - de.genes.list <- de_genes_pairs_multiple(merge.dat.list, merge.de.param.list, cl, pairs=new.pairs, cl.means.list=cl.means.list, cl.present.list=cl.present.list, lfc.conservation.th=lfc.conservation.th, de.genes.list=de.genes.list) + de.genes.list <- de_genes_pairs_multiple(merge.dat.list, merge.de.param.list, cl, pairs=new.pairs, cl.means.list=cl.means.list, cl.present.list=cl.present.list, cl.sqr.means.list= cl.sqr.means.list,lfc.conservation.th=lfc.conservation.th, de.genes.list=de.genes.list,method=de.method) if(verbose){ print("Finish adding de genes") } @@ -312,8 +334,13 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.means.list = get_cl_means_list(merge.dat.list, merge.de.param.list, cl=cl) cl.means.list = sapply(cl.means.list, as.data.frame, simplify=F) + + cl.sqr.means.list = get_cl_sqr_means_list(merge.dat.list, merge.de.param.list, cl=cl) + cl.sqr.means.list = sapply(cl.sqr.means.list, as.data.frame, simplify=F) + cl.present.list = get_cl_present_list(merge.dat.list,merge.de.param.list, cl=cl) cl.present.list = sapply(cl.present.list, as.data.frame, simplify=F) + de.pairs = NULL de.genes.list = sapply(names(merge.dat.list), function(x)list(),simplify=F) diff --git a/R/harmonize_util.R b/R/harmonize_util.R index 5e58630..c9485cb 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -174,6 +174,44 @@ get_cl_means_list <- function(dat.list, cl, de.param.list=NULL, min.cells=NULL, } +get_cl_sqr_means_list <- function(dat.list, cl, de.param.list=NULL, min.cells=NULL, select.genes=NULL, sets=names(dat.list)) + { + if(is.null(min.cells)){ + if(!is.null(de.param.list)){ + min.cells = lapply(de.param.list,"[[", "min.cells") + } + else{ + min.cells = setNames(rep(1, length(dat.list)), names(dat.list)) + } + } + else{ + if(length(min.cells) ==1){ + min.cells = setNames(rep(min.cells, length(dat.list)), names(dat.list)) + } + } + cl.sqr.means.list = list() + for(x in sets){ + tmp.cells = intersect(names(cl), colnames(dat.list[[x]])) + tmp.cl = cl[tmp.cells] + cl.size = table(tmp.cl) + select.cl = names(cl.size)[cl.size >= min.cells[[x]]] + if(length(select.cl)==0){ + return(NULL) + } + tmp.cl = tmp.cl[tmp.cl %in% select.cl] + if(is.factor(tmp.cl)){ + tmp.cl=droplevels(tmp.cl) + } + tmp=get_cl_sqr_means(dat.list[[x]], tmp.cl) + if(!is.null(select.genes)){ + tmp=tmp[select.genes,,drop=F] + } + cl.sqr.means.list[[x]]= tmp + } + return(cl.sqr.means.list) + } + + #' Title #' diff --git a/R/markers.R b/R/markers.R index 32127c3..645b593 100644 --- a/R/markers.R +++ b/R/markers.R @@ -15,7 +15,7 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) { if(is.null(de.genes)){ - de.genes=de_stats_all_pairs(norm.dat, cl, ...) + de.genes=de_all_pairs(norm.dat, cl, ...) } pairs = names(de.genes) pairs.df = gsub("cl","", do.call("rbind",strsplit(pairs, "_"))) diff --git a/R/merge_cl.R b/R/merge_cl.R index ed95d8a..15a8992 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -166,7 +166,7 @@ merge_cl<- function(norm.dat, while(length(new.pairs) > 0){ new.pairs = new.pairs[head(order(merge.pairs[new.pairs,"sim"],decreasing=T), pairBatch)] pairs = rbind(pairs, merge.pairs[new.pairs,,drop=F]) - tmp.de.genes =de_stats_selected_pairs(norm.dat, cl=tmp.cl, pairs=merge.pairs[new.pairs,,drop=F], de.param= de.param, method=de.method) + tmp.de.genes =de_selected_pairs(norm.dat, cl=tmp.cl, pairs=merge.pairs[new.pairs,,drop=F], de.param= de.param, method=de.method) de.genes[names(tmp.de.genes)] = tmp.de.genes gc() tmp.pairs= intersect(names(de.genes), row.names(merge.pairs)) @@ -227,7 +227,7 @@ merge_cl<- function(norm.dat, else{ tmp.cl= cl } - de.genes = de_stats_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param) + de.genes = de_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param) } markers = select_markers(norm.dat, cl, de.genes=de.genes, n.markers=50)$markers sc = sapply(de.genes, function(x){ From 72d2c38bc765c526ee6c95df80e3f7c3fca3e517 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 3 Jun 2020 11:27:39 -0700 Subject: [PATCH 03/70] Propogate the differences in de.gene computation --- R/cluster.R | 77 +++++++------------------- R/consensusCluster.R | 3 +- R/de.genes.R | 41 +++++++------- R/markers.R | 2 - R/merge_cl.R | 128 +++++++++++++++++++++---------------------- R/util.R | 49 ++++++++++++----- 6 files changed, 139 insertions(+), 161 deletions(-) diff --git a/R/cluster.R b/R/cluster.R index 4f735e2..f7304c7 100644 --- a/R/cluster.R +++ b/R/cluster.R @@ -52,11 +52,7 @@ jaccard_louvain.RANN <- function(dat, library(RANN) knn.matrix = RANN::nn2(dat, k = k)[[1]] - jaccard.adj <- knn_jaccard(knn.matrix) - - - leiden.result = leiden(jaccard.adj) - + jaccard.adj <- knn_jaccard(knn.matrix) jaccard.gr <- igraph::graph.adjacency(jaccard.adj, mode = "undirected", weighted = TRUE) @@ -74,40 +70,6 @@ jaccard_louvain.RANN <- function(dat, } } -#' Perform Jaccard/Louvain clustering based on RANN -#' -#' @param dat A matrix of features (rows) x samples (columns) -#' @param k K nearest neighbors to use -#' -#' @return A list object with the cluster factor object and (cl) and Jaccard/Louvain results (result) -#' -jaccard_leiden.RANN <- function(dat, - k = 10) -{ - library(igraph) - library(matrixStats) - library(RANN) - library(leiden) - - knn.matrix = RANN::nn2(dat, k = k)[[1]] - - jaccard.adj <- knn_jaccard(knn.matrix) - - - leiden.result <- igraph::cluster_louvain(jaccard.gr) - mod.sc <- igraph::modularity(louvain.result) - - if(pass_louvain(mod.sc, jaccard.adj)) { - - cl <- setNames(louvain.result$membership, row.names(dat)) - - return(list(cl = cl, result = louvain.result)) - - } else{ - return(NULL) - } -} - #' Perform Jaccard/Louvain clustering using Rphenograph #' @@ -159,8 +121,8 @@ filter_RD <- function(rd.dat, rm.eigen, rm.th, verbose=FALSE) # jaccard_leiden <- function(dat, k = 10, weight = NULL, - num_iter = 2, - resolution_parameter = 0.0001, + num_iter = 5, + resolution_parameter = 1, random_seed = NULL, verbose = FALSE, ...) { @@ -182,8 +144,8 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, cluster_result <- leidenbase::leiden_find_partition(jaccard.gr, partition_type = partition_type, - num_iter=10, - resolution_parameter=0.01, + num_iter=num_iter, + resolution_parameter=resolution_parameter, verbose = FALSE ) cl <- setNames(cluster_result$membership, row.names(dat)) @@ -222,7 +184,7 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, onestep_clust <- function(norm.dat, select.cells = colnames(norm.dat), counts = NULL, - method = c("louvain","leiden","ward.D", "kmeans"), + method = c("leiden","louvain","ward.D", "kmeans"), vg.padj.th = 0.5, dim.method = c("pca","WGCNA"), max.dim = 20, @@ -236,7 +198,8 @@ onestep_clust <- function(norm.dat, k.nn = 15, prefix = NULL, verbose = FALSE, - regress.x=NULL) + regress.x=NULL, + max.cl=NULL) { library(matrixStats) @@ -261,10 +224,10 @@ onestep_clust <- function(norm.dat, ###Find high variance genes. if(is.null(counts)){ if(is.matrix(norm.dat)){ - counts = 2^(norm.dat[,sampled.cells])-1 + counts = 2^(norm.dat[select.genes,sampled.cells])-1 } else{ - counts = norm.dat[,sampled.cells] + counts = norm.dat[select.genes,sampled.cells] counts@x = 2^(norm.dat@x) - 1 } } @@ -272,7 +235,9 @@ onestep_clust <- function(norm.dat, if(verbose & !is.null(prefix)){ plot_file=paste0(prefix,".vg.pdf") } - vg = find_vg(as.matrix(counts[select.genes,sampled.cells]),plot_file=plot_file) + vg = find_vg(counts,plot_file=plot_file) + rm(counts) + gc() if(dim.method=="auto"){ if(length(select.cells)> 1000){ dim.method="pca" @@ -305,13 +270,16 @@ onestep_clust <- function(norm.dat, if(!is.null(rm.eigen)){ rd.dat <- filter_RD(rd.dat, rm.eigen, rm.th, verbose=verbose) } + if(is.null(rd.dat)||ncol(rd.dat)==0){ return(NULL) } if(verbose){ print(method) } - max.cl = ncol(rd.dat)*2 + 1 + if(is.null(max.cl)){ + max.cl = ncol(rd.dat)*2 + 1 + } if(method=="louvain"){ k = pmin(k.nn, round(nrow(rd.dat)/2)) tmp = jaccard_louvain(rd.dat, k) @@ -320,16 +288,13 @@ onestep_clust <- function(norm.dat, } cl = tmp$cl if(length(unique(cl))>max.cl){ - tmp.means =do.call("cbind",tapply(names(cl),cl, function(x){ - colMeans(rd.dat[x,,drop=F]) - },simplify=F)) + tmp.means = get_cl_means(rd.dat, cl) tmp.hc = hclust(dist(t(tmp.means)), method="average") tmp.cl= cutree(tmp.hc, pmin(max.cl, length(unique(cl)))) cl = setNames(tmp.cl[as.character(cl)], names(cl)) } } - else if(method=="leiden"){ k = pmin(k.nn, round(nrow(rd.dat)/2)) tmp = jaccard_leiden(rd.dat, k) @@ -359,8 +324,8 @@ onestep_clust <- function(norm.dat, stop(paste("Unknown clustering method", method)) } #print(table(cl)) - rd.dat.t = t(rd.dat) - merge.result=merge_cl(norm.dat, cl=cl, rd.dat.t=rd.dat.t, merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size,verbose=verbose) + merge.result=merge_cl(norm.dat, cl=cl, rd.dat=rd.dat, merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size,verbose=verbose) + gc() if(is.null(merge.result))return(NULL) sc = merge.result$sc @@ -505,4 +470,4 @@ combine_finer_split <- function(cl, finer.cl) finer.cl = finer.cl + max.cl cl[names(finer.cl)] = finer.cl return(cl) -} \ No newline at end of file +} diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 4fd1003..73069a2 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -165,8 +165,7 @@ iter_consensus_clust <- function(cl.list, } tmp.cl=merge_cl_by_co(tmp.cl, co.ratio=co.ratio, cl.mat=cl.mat[,names(tmp.cl)],diff.th) cell.cl.co.ratio= get_cell.cl.co.ratio(tmp.cl, co.ratio= co.ratio, cl.mat=cl.mat[,names(tmp.cl)]) - tmp= merge_cl(norm.dat=norm.dat, cl=tmp.cl, rd.dat.t=t(cell.cl.co.ratio), verbose=verbose, de.param = de.param, return.markers=TRUE, max.cl.size= max.cl.size, merge.type=merge.type) - + tmp= merge_cl(norm.dat=norm.dat, cl=tmp.cl, rd.dat=cell.cl.co.ratio, verbose=verbose, de.param = de.param, return.markers=TRUE, max.cl.size= max.cl.size, merge.type=merge.type) markers=tmp$markers if(is.null(tmp) | !is.list(tmp)) return(NULL) if (length(unique(tmp$cl))==1) return(NULL) diff --git a/R/de.genes.R b/R/de.genes.R index bfa1758..1bc06bb 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -479,6 +479,7 @@ simple_ebayes <- function(fit,proportion=0.01,stdev.coef.lim=c(0.1,4),trend=FALS # 8 Sept 2002. Last revised 1 May 2013. # Made a non-exported function 18 Feb 2018. { + require(limma) coefficients <- fit$coefficients stdev.unscaled <- fit$stdev.unscaled sigma <- fit$sigma @@ -532,12 +533,12 @@ de_pair_fast_limma <- function(pair, padj <- p.adjust(pval) # Note: Above depends on the data being log2 scaled already. - # If we change this expectation, we may need a more generalized calculation. + # If we change this expectation, we may need a more generalized calculation. # fc <- cl.means[, x] / cl.means[, y] # lfc <- log2(fc) # lfc[is.na(lfc)] <- 0 - results <- data.frame(padj = padj, + results <- data.frame(padj = padj, pval = pval, lfc = lfc, meanA = m1, @@ -545,9 +546,9 @@ de_pair_fast_limma <- function(pair, q1 = cl.present[[x]], q2 = cl.present[[y]]) - row.names(results) <- genes + row.names(results) <- genes - return(results) + return(results) } @@ -570,26 +571,26 @@ de_pair_fast_limma <- function(pair, cl, pairs, de.param = de_parm(), - method = "limma", + method = "fast_limma", cl.means = NULL, cl.present = NULL, - cl.sq.means = NULL, + cl.sqr.means = NULL, use.voom = FALSE, counts = NULL, mc.cores = 1, return.df = FALSE) { method <- match.arg(method, - choices = c("limma", "fast_limma", "chisq", "t.test")) + choices = c("fast_limma", "limma","chisq", "t.test")) if(use.voom & is.null(counts)) { stop("The use.voom = TRUE parameter requires a raw count matrix via the counts parameter.") } # Sample filtering based on selected clusters - select.cl <- unique(c(pairs[,1], pairs[,2])) cl.size <- table(cl) cl.size = setNames(as.integer(cl.size), names(cl.size)) + select.cl <- unique(c(pairs[,1], pairs[,2])) select.cl <- intersect(select.cl, names(cl.size)[cl.size >= de.param$min.cells]) pairs = pairs[pairs[,1]%in% select.cl & pairs[,2] %in% select.cl,] @@ -624,15 +625,11 @@ de_pair_fast_limma <- function(pair, # Compute fraction of cells in each cluster with expression >= low.th if(is.null(cl.present)){ - low.th = de.param$low.th - if(length(low.th) == 1) { - low.th <- setNames(rep(low.th, nrow(norm.dat)), row.names(norm.dat)) - } - cl.present <- as.data.frame(get_cl_means(norm.dat >= low.th[row.names(norm.dat)],cl)) + cl.present <- as.data.frame(get_cl_present(norm.dat, cl, de.param$low.th)) } else { cl.present <- as.data.frame(cl.present) } - + if(method == "limma"){ norm.dat <- as.matrix(norm.dat[, names(cl)]) cl <- setNames(as.factor(paste0("cl",cl)),names(cl)) @@ -661,11 +658,11 @@ de_pair_fast_limma <- function(pair, registerDoSEQ() } else { - cl <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(cl) - on.exit(parallel::stopCluster(cl), add = TRUE) + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) } - + de_list = pvec(1:nrow(pairs), function(x){ sapply(x, function(i){ if(method == "limma") { @@ -834,17 +831,19 @@ de_stats_pair <- function(df, up.score <- sum(tmp) tmp = down.genes tmp[tmp > 20] = 20 - down.score <- sum(down) + down.score <- sum(tmp) result=list( + up.genes=up.genes, + down.genes=down.genes, up.score = up.score, down.score = down.score, score = up.score + down.score, up.num = length(up.genes), down.num = length(down.genes), - num = up.num + down.num + num = length(up.genes) + length(down.genes) ) - + if(return.df){ result$de.df = df[select,] diff --git a/R/markers.R b/R/markers.R index 645b593..3fab425 100644 --- a/R/markers.R +++ b/R/markers.R @@ -20,8 +20,6 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) pairs = names(de.genes) pairs.df = gsub("cl","", do.call("rbind",strsplit(pairs, "_"))) - - row.names(pairs.df)=pairs select.pairs = pairs[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] de.markers = sapply(select.pairs, function(s){ diff --git a/R/merge_cl.R b/R/merge_cl.R index 15a8992..412d786 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -40,7 +40,6 @@ test_merge <- function(de.pair, de.param, merge.type="undirectional") #' @param norm.dat normalized expression data matrix in log transform, using genes as rows, and cells and columns. Users can use log2(FPKM+1) or log2(CPM+1) #' @param cl A vector of cluster membership with cell index as names, and cluster id as values. #' @param rd.dat Reduced dimensions for cells. Used to determine which clusters are close to each other. Clusters are merged among nearest neighbors first. -#' @param rd.dat.t Transpose of rd.dat #' @param de.param The DE gene criteria. See de_param for details. #' @param merge.type Determine if the DE gene score threshold should be applied to combined de.score, or de.score for up and down directions separately. #' @param max.cl.size Sampled cluster size. This is to speed up limma DE gene calculation. Instead of using all cells, we randomly sampled max.cl.size number of cells for testing DE genes. @@ -56,20 +55,16 @@ test_merge <- function(de.pair, de.param, merge.type="undirectional") #' merge_cl<- function(norm.dat, cl, - rd.dat = NULL, - rd.dat.t = NULL, + rd.dat, de.param = de_param(), merge.type = c("undirectional","directional"), max.cl.size = 300, - de.method = "limma", + de.method = "fast_limma", de.genes = NULL, return.markers = FALSE, pairBatch =40, verbose = 0) { - if (is.null(rd.dat.t)){ - rd.dat.t = Matrix::t(rd.dat) - } if(!is.integer(cl)){ cl = setNames(as.integer(as.character(cl)), names(cl)) } @@ -81,7 +76,8 @@ merge_cl<- function(norm.dat, row.names(pairs)=names(de.genes) } ###Merge small clusters with the closest neighbors first. - cl.rd = get_cl_means(rd.dat.t,cl[names(cl) %in% colnames(rd.dat.t)]) + cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) + cl.size = table(cl) while(TRUE){ cl.size = table(cl) if(length(cl.size)==1){ @@ -93,10 +89,10 @@ merge_cl<- function(norm.dat, } ##Compute cluster similary on reduced dimension if(ncol(cl.rd)>2 & nrow(cl.rd) > 2){ - cl.sim = cor(cl.rd) + cl.sim = cor(as.matrix(cl.rd)) } else{ - cl.diff=as.matrix(dist(t(cl.rd))) + cl.diff=as.matrix(dist(t(as.matrix(cl.rd)))) cl.sim = 1 - cl.diff/max(cl.diff) } tmp=as.data.frame(as.table(cl.sim[cl.small,,drop=F])) @@ -109,13 +105,17 @@ merge_cl<- function(norm.dat, if(verbose > 0){ cat("Merge: ", x,y, "sim:", tmp[closest.pair,3],"\n") } - cl[cl==x]= y - tmp.cells = intersect(names(cl)[cl==y], colnames(rd.dat.t)) - tmp= Matrix::rowMeans(rd.dat.t[,tmp.cells,drop=FALSE]) - cl.rd[,as.character(y)]= tmp - cl.rd = cl.rd[,colnames(cl.rd)!=x,drop=F] + cl[cl==y]= x + p = as.character(c(x,y)) + cl.rd[[p[1]]] = get_weighted_means(as.matrix(cl.rd[,p]), as.vector(cl.size[p])) + cl.rd[[p[2]]] = NULL + cl.size[p[1]] = sum(cl.size[p]) + cl.size = cl.size[names(cl.size)!=p[2]] } - + cl.means = as.data.frame(get_cl_means(norm.dat, cl)) + cl.present = as.data.frame(get_cl_present(norm.dat, cl,low.th=de.param$low.th)) + cl.sqr.means = as.data.frame(get_cl_sqr_means(norm.dat,cl)) + while(length(unique(cl)) > 1){ if(length(unique(cl)) == 2){ merge.pairs = as.data.frame(matrix(as.integer(colnames(cl.rd)), nrow=1)) @@ -132,10 +132,9 @@ merge_cl<- function(norm.dat, cl.sim = 1 - cl.diff/max(cl.diff) } - knn.matrix=t(sapply(1:nrow(cl.sim), function(i){colnames(cl.sim)[-i][order(cl.sim[i,-i],decreasing=T)]})) - row.names(knn.matrix)=row.names(cl.sim) - knn.matrix = knn.matrix[,1:min(3,ncol(knn.matrix))] - merge.pairs = do.call("rbind",apply(knn.matrix, 2,function(x)data.frame(c1=row.names(knn.matrix),c2=x, stringsAsFactors=FALSE))) + knn.matrix= sim_knn(cl.sim, k=pmin(4, ncol(cl.sim))) + merge.pairs = do.call("rbind",apply(knn.matrix, 2,function(x)data.frame(c1=row.names(knn.matrix),c2=colnames(cl.sim)[x] , stringsAsFactors=FALSE))) + merge.pairs = merge.pairs[merge.pairs[,1]!=merge.pairs[,2],] merge.pairs$sim = get_pair_matrix(cl.sim, merge.pairs[,1], merge.pairs[,2]) merge.pairs[,1] = as.integer(merge.pairs[,1]) merge.pairs[,2] = as.integer(merge.pairs[,2]) @@ -147,71 +146,68 @@ merge_cl<- function(norm.dat, row.names(merge.pairs) = p[!duplicated(p)] merge.pairs = merge.pairs[order(merge.pairs$sim,decreasing=T),] } - - + ###Determine the de score for these pairs if(nrow(merge.pairs)==0){ break } - ##Down sample cells for efficiency - if(!is.null(max.cl.size)){ - sampled.cells = sample_cells(cl[names(cl) %in% colnames(norm.dat)], max.cl.size) - tmp.cl= cl[sampled.cells] - } - else{ - tmp.cl= cl - } - #####Check pairs already known but not yet merged yet. + + #####get DE genes for new pairs new.pairs = setdiff(row.names(merge.pairs),names(de.genes)) - while(length(new.pairs) > 0){ - new.pairs = new.pairs[head(order(merge.pairs[new.pairs,"sim"],decreasing=T), pairBatch)] - pairs = rbind(pairs, merge.pairs[new.pairs,,drop=F]) - tmp.de.genes =de_selected_pairs(norm.dat, cl=tmp.cl, pairs=merge.pairs[new.pairs,,drop=F], de.param= de.param, method=de.method) - de.genes[names(tmp.de.genes)] = tmp.de.genes - gc() - tmp.pairs= intersect(names(de.genes), row.names(merge.pairs)) - sc = sapply(de.genes[tmp.pairs], function(x){ - if(length(x)>0){x$score} - else{0} - }) - sc = sort(sc) - #print(head(sc,10)) - to.merge = sapply(names(sc), function(p){ - to.merge = test_merge(de.genes[[p]], de.param, merge.type=merge.type) - }) - if(sum(to.merge)>0){ - sc = sc[to.merge] - to.merge= merge.pairs[names(sc),,drop=FALSE] - to.merge$sc = sc - break - } - new.pairs = setdiff(row.names(merge.pairs),names(de.genes)) + if(verbose > 0){ + cat("Compute DE genes\n") } - ###all pairs have been checked and no pairs under DE threshold - if(length(new.pairs)==0){ + tmp.de.genes =de_selected_pairs(norm.dat, cl=cl, pairs=merge.pairs[new.pairs,], de.param= de.param, method=de.method, cl.means=cl.means, cl.present=cl.present, cl.sqr.means=cl.sqr.means) + de.genes[names(tmp.de.genes)] = tmp.de.genes + pairs = get_pairs(names(de.genes)) + + tmp.pairs= intersect(names(de.genes), row.names(merge.pairs)) + sc = sapply(de.genes[tmp.pairs], function(x){ + if(length(x)>0){x$score} + else{0} + }) + sc = sort(sc) + #print(head(sc,10)) + to.merge = sapply(names(sc), function(p){ + to.merge = test_merge(de.genes[[p]], de.param, merge.type=merge.type) + }) + if(sum(to.merge)==0){ break } + sc = sc[to.merge] + to.merge= merge.pairs[names(sc),,drop=FALSE] + to.merge$sc = sc + + merged =c() ###The first pair in to.merge always merge. For the remaining pairs, if both clusters have already enough cells, ###or independent of previus merging, then they can be directly merged as well, without re-assessing DE genes. for(i in 1:nrow(to.merge)){ p = c(to.merge[i,1], to.merge[i,2]) if(i == 1 | sc[i] < de.param$de.score.th /2 & length(intersect(p, merged))==0){ + cl[cl==p[2]] = p[1] + + p = as.character(p) if(verbose > 0){ - cat("Merge ",p[1], p[2], to.merge[i,"sc"], to.merge[i, "sim"], sum(tmp.cl== p[1]),"cells", sum(tmp.cl==p[2]),"cells", "\n") + cat("Merge ",p[1], p[2], to.merge[i,"sc"], to.merge[i, "sim"], cl.size[p[1]],"cells", cl.size[p[2]],"cells", "\n") } - cl[cl==p[2]] = p[1] + + cl.rd[[p[1]]] = get_weighted_means(as.matrix(cl.rd[,p]), cl.size[p]) + cl.rd[[p[2]]] = NULL + cl.means[[p[1]]] = get_weighted_means(as.matrix(cl.means[, p]), cl.size[p]) + cl.means[[p[2]]] = NULL + cl.present[[p[1]]] = get_weighted_means(as.matrix(cl.present[, p]), cl.size[p]) + cl.present[[p[2]]] = NULL + cl.sqr.means[[p[1]]] = get_weighted_means(as.matrix(cl.sqr.means[, p]), cl.size[p]) + cl.sqr.means[[p[2]]] = NULL + cl.size[p[1]] = sum(cl.size[p]) + cl.size = cl.size[names(cl.size)!=p[2]] rm.pairs = row.names(pairs)[pairs[,1]%in% p | pairs[,2]%in% p] de.genes = de.genes[setdiff(names(de.genes),rm.pairs)] - tmp.cells = intersect(names(cl)[cl==p[1]], colnames(rd.dat.t)) - tmp= Matrix::rowMeans(rd.dat.t[,tmp.cells,drop=FALSE]) - cl.rd[,as.character(p[1])]= tmp - cl.rd = cl.rd[,colnames(cl.rd)!=p[2],drop=F] + merged = c(merged,p) } - merged = c(merged, p) } - pairs = pairs[names(de.genes),,drop=F] - } + } if(length(unique(cl))<2){ return(NULL) } @@ -227,7 +223,7 @@ merge_cl<- function(norm.dat, else{ tmp.cl= cl } - de.genes = de_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param) + de.genes = de_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param, cl.means=cl.means, cl.present=cl.present, cl.sqr.mans=cl.sqr.means) } markers = select_markers(norm.dat, cl, de.genes=de.genes, n.markers=50)$markers sc = sapply(de.genes, function(x){ diff --git a/R/util.R b/R/util.R index 140d3de..2a1cb1b 100644 --- a/R/util.R +++ b/R/util.R @@ -222,6 +222,11 @@ convert_pair_matrix_str <- function(pair.str, } +get_weighted_means <- function(mat, w) + { + rowSums(tcrossprod(mat,diag(w)))/sum(w) + } + #' Generate a sparse matrix one-hot representation of clusters x samples #' #' @param cl a cluster factor object @@ -229,20 +234,25 @@ convert_pair_matrix_str <- function(pair.str, #' @return a sparse, one-hot matrix indicating which cluster(columns) each sample (rows) belongs to. #' @export #' -get_cl_mat <- function(cl) { +get_cl_mat <- function(cl, all.cells=NULL) { if(!is.factor(cl)){ cl <- as.factor(cl) } cl <- droplevels(cl) - - cl.mat <- Matrix::sparseMatrix(i = 1:length(cl), - j = as.integer(cl), - x = 1) - - rownames(cl.mat) <- names(cl) + if(is.null(all.cells)){ + all.cells = names(cl) + i = 1:length(cl) + } + else{ + i = match(names(cl),all.cells) + } + j = as.integer(cl) + cl.mat <- Matrix::sparseMatrix(i = i, + j = j, + x = 1, dims=c(length(all.cells), max(j))) + rownames(cl.mat) <- all.cells colnames(cl.mat) <- levels(cl) - return(cl.mat) } @@ -255,14 +265,15 @@ get_cl_mat <- function(cl) { #' @export #' get_cl_sums <- function(mat, - cl) { - - cl.mat <- get_cl_mat(cl) + cl) +{ if(all(names(cl) %in% colnames(mat))){ - cl.sums <- Matrix::tcrossprod(mat[,rownames(cl.mat)], Matrix::t(cl.mat)) + cl.mat <- get_cl_mat(cl, all.cells=colnames(mat)) + cl.sums <- Matrix::tcrossprod(mat, Matrix::t(cl.mat)) } else{ - cl.sums <- Matrix::crossprod(mat[,rownames(cl.mat)], cl.mat) + cl.mat <- get_cl_mat(cl, all.cells=row.names(mat)) + cl.sums <- Matrix::crossprod(mat, cl.mat) } cl.sums <- as.matrix(cl.sums) return(cl.sums) @@ -288,7 +299,17 @@ get_cl_means <- function(mat, return(cl.means) } - +get_cl_present <- function(mat, cl, low.th) + { + tmp = mat + if(is.matrix(tmp)){ + tmp = tmp > low.th + } + else{ + tmp@x = as.numeric(tmp@x > low.th) + } + cl.present = get_cl_means(tmp,cl) + } get_cl_sqr_means<- function(mat, cl) { From befba4b7f77eb188325bbad8240e12ecff4d80fb Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 3 Jun 2020 12:09:42 -0700 Subject: [PATCH 04/70] Allow rd.dat and rd.dat.t --- R/merge_cl.R | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/R/merge_cl.R b/R/merge_cl.R index 412d786..6d76b0d 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -55,7 +55,8 @@ test_merge <- function(de.pair, de.param, merge.type="undirectional") #' merge_cl<- function(norm.dat, cl, - rd.dat, + rd.dat=NULL, + rd.dat.t = NULL, de.param = de_param(), merge.type = c("undirectional","directional"), max.cl.size = 300, @@ -76,7 +77,12 @@ merge_cl<- function(norm.dat, row.names(pairs)=names(de.genes) } ###Merge small clusters with the closest neighbors first. - cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) + if(is.null(rd.dat)){ + cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) + } + else{ + cl.rd = as.data.frame(get_cl_means(rd.dat.t,cl[names(cl) %in% colnames(rd.dat)])) + } cl.size = table(cl) while(TRUE){ cl.size = table(cl) From 519cbdb03cb56db7eefdc067dc912b68e1d0d462 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 3 Jun 2020 12:27:31 -0700 Subject: [PATCH 05/70] Change typo --- R/merge_cl.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/merge_cl.R b/R/merge_cl.R index 6d76b0d..bddd2c1 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -77,7 +77,7 @@ merge_cl<- function(norm.dat, row.names(pairs)=names(de.genes) } ###Merge small clusters with the closest neighbors first. - if(is.null(rd.dat)){ + if(!is.null(rd.dat)){ cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) } else{ From 26a1fa5e120ff56d32aa49a406c2db2f31b5109c Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 22 Jun 2020 11:36:20 -0700 Subject: [PATCH 06/70] Add elbow test for PCA --- R/cluster.R | 27 +++--- R/consensusCluster.R | 19 ++-- R/de.genes.R | 26 ++++-- R/find_noise_cl.R | 56 +++++++----- R/harmonize.R | 2 +- R/heatmap.R | 4 +- R/markers.R | 194 ++++++++++++++++++++++++++++------------ R/merge_cl.R | 4 +- R/reduceDimension_PCA.R | 59 ++++++++++-- R/util.R | 19 +++- 10 files changed, 296 insertions(+), 114 deletions(-) diff --git a/R/cluster.R b/R/cluster.R index f7304c7..7cf67df 100644 --- a/R/cluster.R +++ b/R/cluster.R @@ -122,7 +122,7 @@ filter_RD <- function(rd.dat, rm.eigen, rm.th, verbose=FALSE) jaccard_leiden <- function(dat, k = 10, weight = NULL, num_iter = 5, - resolution_parameter = 1, + resolution_parameter = 0.01, random_seed = NULL, verbose = FALSE, ...) { @@ -130,9 +130,11 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, library(matrixStats) library(RANN) library(Matrix) - + + if(verbose){ + cat("Compute Jaccard distance\n") + } knn.matrix = RANN::nn2(dat, k = k)[[1]] - jaccard.adj <- knn_jaccard(knn.matrix) jaccard.gr <- igraph::graph.adjacency(jaccard.adj, mode = "undirected", @@ -141,7 +143,9 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, partition_type <- 'CPMVertexPartition' #write line to determine optimal resolutoin↔ - + if(verbose){ + cat("Leiden clustering\n") + } cluster_result <- leidenbase::leiden_find_partition(jaccard.gr, partition_type = partition_type, num_iter=num_iter, @@ -149,8 +153,6 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, verbose = FALSE ) cl <- setNames(cluster_result$membership, row.names(dat)) - - return(list(cl = cl, result = cluster_result)) } @@ -184,7 +186,7 @@ jaccard_leiden <- function(dat, k = 10, weight = NULL, onestep_clust <- function(norm.dat, select.cells = colnames(norm.dat), counts = NULL, - method = c("leiden","louvain","ward.D", "kmeans"), + method = c("louvain","ward.D", "leiden","kmeans"), vg.padj.th = 0.5, dim.method = c("pca","WGCNA"), max.dim = 20, @@ -220,7 +222,8 @@ onestep_clust <- function(norm.dat, sampled.cells = select.cells } ###Find high variance genes - select.genes = row.names(norm.dat)[which(Matrix::rowSums(norm.dat[,select.cells] > de.param$low.th) >= de.param$min.cells)] + tmp = get_cl_present(norm.dat, setNames(rep(1, length(select.cells)),select.cells), de.param$low.th) + select.genes = row.names(norm.dat)[which(tmp * length(select.cells) >= de.param$min.cells)] ###Find high variance genes. if(is.null(counts)){ if(is.matrix(norm.dat)){ @@ -262,7 +265,11 @@ onestep_clust <- function(norm.dat, if(length(select.genes)< de.param$min.genes){ return(NULL) } - rd.dat = rd_PCA(norm.dat,select.genes, select.cells, sampled.cells=sampled.cells, max.pca = max.dim)$rd.dat + rd.result = rd_PCA(norm.dat,select.genes, select.cells, sampled.cells=sampled.cells, max.pca = max.dim) + rd.dat = rd.result$rd.dat + if(verbose){ + cat("PCA dimensions:",ncol(rd.dat),"\n") + } } if(is.null(rd.dat)||ncol(rd.dat)==0){ return(NULL) @@ -278,7 +285,7 @@ onestep_clust <- function(norm.dat, print(method) } if(is.null(max.cl)){ - max.cl = ncol(rd.dat)*2 + 1 + max.cl = pmin(ncol(rd.dat)*2 + 1, round(length(select.cells)/de.param$min.cells)) } if(method=="louvain"){ k = pmin(k.nn, round(nrow(rd.dat)/2)) diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 73069a2..f4ecb50 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -48,7 +48,7 @@ get_co_ratio <- function(cl.mat, cells, n.times) #' Iterative consensus clustering #' -#' @param co.ratio cell cell co-clustering matrix +#' @param co.ratio cell cel√l co-clustering matrix #' @param cl.list The list of subsampled clustering results. #' @param norm.dat The log2 transformed normalzied expression matrix #' @param select.cells Cells to be clustered @@ -165,7 +165,7 @@ iter_consensus_clust <- function(cl.list, } tmp.cl=merge_cl_by_co(tmp.cl, co.ratio=co.ratio, cl.mat=cl.mat[,names(tmp.cl)],diff.th) cell.cl.co.ratio= get_cell.cl.co.ratio(tmp.cl, co.ratio= co.ratio, cl.mat=cl.mat[,names(tmp.cl)]) - tmp= merge_cl(norm.dat=norm.dat, cl=tmp.cl, rd.dat=cell.cl.co.ratio, verbose=verbose, de.param = de.param, return.markers=TRUE, max.cl.size= max.cl.size, merge.type=merge.type) + tmp= merge_cl(norm.dat=norm.dat, cl=tmp.cl, rd.dat=cell.cl.co.ratio, verbose=verbose, de.param = de.param, return.markers=FALSE, max.cl.size= max.cl.size, merge.type=merge.type) markers=tmp$markers if(is.null(tmp) | !is.list(tmp)) return(NULL) if (length(unique(tmp$cl))==1) return(NULL) @@ -219,12 +219,17 @@ collect_subsample_cl_matrix <- function(norm.dat,result.files,all.cells,max.cl.s if(is.null(result)){ return(NULL) } - cl= result$cl + cl= result$cl test.cells = setdiff(all.cells, names(cl)) - markers=unique(result$markers) - map.df = map_by_cor(norm.dat[markers,names(cl)],cl, norm.dat[markers,test.cells],method="mean")$pred.df - test.cl = setNames(map.df$pred.cl, row.names(map.df)) - all.cl = c(setNames(as.character(cl),names(cl)), setNames(as.character(test.cl), names(test.cl))) + if(length(test.cells)>0){ + markers=unique(result$markers) + map.df = map_by_cor(norm.dat[markers,names(cl)],cl, norm.dat[markers,test.cells],method="mean")$pred.df + test.cl = setNames(map.df$pred.cl, row.names(map.df)) + all.cl = c(setNames(as.character(cl),names(cl)), setNames(as.character(test.cl), names(test.cl))) + } + else{ + all.cl = cl + } return(all.cl[all.cells]) } if (mc.cores==1){ diff --git a/R/de.genes.R b/R/de.genes.R index 1bc06bb..79e513b 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -592,7 +592,7 @@ de_pair_fast_limma <- function(pair, cl.size = setNames(as.integer(cl.size), names(cl.size)) select.cl <- unique(c(pairs[,1], pairs[,2])) select.cl <- intersect(select.cl, names(cl.size)[cl.size >= de.param$min.cells]) - pairs = pairs[pairs[,1]%in% select.cl & pairs[,2] %in% select.cl,] + pairs = pairs[pairs[,1]%in% select.cl & pairs[,2] %in% select.cl,,drop=F] cl <- cl[cl %in% select.cl] if(is.factor(cl)){ @@ -652,7 +652,9 @@ de_pair_fast_limma <- function(pair, else if (method == "t.test"){ cl.vars <- as.data.frame(get_cl_vars(norm.dat, cl, cl.means = cl.means)) } - library(foreach) + if(nrow(pairs)< 50){ + mc.cores=1 + } library(doParallel) if (mc.cores == 1) { registerDoSEQ() @@ -744,6 +746,20 @@ create_pairs <- function(cn, direction="nondirectional", include.self = FALSE) } +null_de <- function() + { + tmp=sapply(c("score","up.score","down.score","num","up.num","down.num"), function(x)0) + tmp = c(tmp, list(up.genes=NULL, down.genes=NULL)) + } + + +get_de_truncate_score_sum <- function(gene.score, th=20) + { + tmp = gene.score + tmp[tmp > 20] = 20 + return(sum(tmp)) + } + #' Compute differential expression summary statistics based on a differential results data.frame and de_param(). #' #' @param df A data.frame of pairwise differential expression results (i.e. from \code{score_selected_pairs()}). @@ -781,7 +797,7 @@ de_stats_pair <- function(df, } if(is.null(select) | length(select) == 0){ - return(list()) + return(null_de()) } up <- select[df[select, "lfc"] > 0] @@ -820,7 +836,7 @@ de_stats_pair <- function(df, select <- c(up, down) if(length(select) == 0){ - return(list()) + return(null_de()) } else { up.genes = setNames(-log10(df[up,"padj"]), up) @@ -868,7 +884,7 @@ de_stats_pair <- function(df, de_all_pairs <- function(norm.dat, cl, de.param = de_param(), - method = "limma", + method = "fast_limma", de.genes = NULL, ...) { cn <- as.character(sort(unique(cl))) diff --git a/R/find_noise_cl.R b/R/find_noise_cl.R index 5b3b1d3..809417b 100644 --- a/R/find_noise_cl.R +++ b/R/find_noise_cl.R @@ -288,20 +288,22 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) if(is.null(de.genes)){ stop("Need to specify de.genes") } - #require(foreach) - #require(doParallel) - #if (mc.cores == 1) { - # registerDoSEQ() - #} - #else { - # cores <- makeForkCluster(mc.cores) - # doParallel::registerDoParallel(cores) - # on.exit(parallel::stopCluster(cores), add = TRUE) - #} + require(foreach) + require(doParallel) + if (mc.cores == 1) { + registerDoSEQ() + } + else { + cores <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(cores) + on.exit(parallel::stopCluster(cores), add = TRUE) + } result.list= pvec(names(de.genes), function(pairs){ result.list= sapply(pairs, function(p){ - #print(p) de = de.genes[[p]] + if(length(de)==0){ + return(NULL) + } if(de$up.num < min.genes | de$down.num < min.genes){ return(NULL) } @@ -312,36 +314,40 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) up.genes = head(names(de$up.genes), 50) down.genes = head(names(de$down.genes),50) - up.genes.score = sum(-log10(de$up.genes[up.genes])) - down.genes.score = sum(-log10(de$down.genes[down.genes])) + up.genes.score = de$up.score + down.genes.score = de$down.score results = sapply(setdiff(as.character(cl),c(cl1,cl2)), function(cl3){ tmp1.de = get_de_pair(de.genes, cl1, cl3) tmp2.de = get_de_pair(de.genes, cl3, cl2) - + if(tmp1.de$num < 20 | tmp2.de$num < 20 ){ + return(NULL) + } olap.up.genes1 = intersect(names(tmp2.de$up.genes), up.genes) olap.up.num1 = length(olap.up.genes1) - olap.up.score1 = sum(-log10(de$up.genes[olap.up.genes1])) + olap.up.score1 = get_de_truncate_score_sum(de$up.genes[olap.up.genes1]) + olap.up.ratio1 = olap.up.score1 / up.genes.score olap.down.genes1 = intersect(names(tmp1.de$down.genes), down.genes) olap.down.num1 = length(olap.down.genes1) - olap.down.score1 = sum(-log10(de$down.genes[olap.down.genes1])) + + olap.down.score1 = get_de_truncate_score_sum(de$down.genes[olap.down.genes1]) olap.down.ratio1 = olap.down.score1 / down.genes.score up.genes2 = head(names(tmp1.de$up.genes), 50) - up.genes.score2 = sum(-log10(tmp1.de$up.genes[up.genes2])) + up.genes.score2 = get_de_truncate_score_sum(tmp1.de$up.genes[up.genes2]) olap.up.genes2 = intersect(names(up.genes2),de$up.genes) olap.up.num2 = length(olap.up.genes2) - olap.up.score2 = sum(-log10(tmp1.de$up.genes[olap.up.genes2])) + olap.up.score2 = get_de_truncate_score_sum(tmp1.de$up.genes[olap.up.genes2]) olap.up.ratio2 = olap.up.score2 /up.genes.score2 down.genes2 = head(names(tmp2.de$down.genes), 50) - down.genes.score2 = sum(-log10(tmp2.de$down.genes[down.genes2])) + down.genes.score2 = get_de_truncate_score_sum(tmp2.de$down.genes[down.genes2]) olap.down.genes2 = intersect(down.genes2,names(de$down.genes)) olap.down.num2 = length(olap.down.genes2) - olap.down.score2 = sum(-log10(tmp2.de$down.genes[olap.down.genes2])) + olap.down.score2 = get_de_truncate_score_sum(tmp2.de$down.genes[olap.down.genes2]) olap.down.ratio2 = olap.down.score2 /down.genes.score2 result = list( @@ -356,15 +362,21 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) result$score = sum(result$olap.score) / sum(c(up.genes.score, down.genes.score, up.genes.score2, down.genes.score2)) return(result) },simplify=F) - test.score=sapply(results, function(x)x$score) + if(is.null(results) | length(results)==0){ + return(NULL) + } + test.score=unlist(sapply(results, function(x)x$score)) tmp = names(which.max(test.score)) result = results[[tmp]] result$cl = tmp return(result) },simplify=F) },mc.cores=mc.cores) - names(result.list) = names(de.genes) + result.list = result.list[!sapply(result.list, is.null)] + if(is.null(result.list)| length(result.list)==0){ + return(NULL) + } cl = sapply(result.list, function(x)x$cl) cl1 = sapply(result.list, function(x)x$cl1) cl2 = sapply(result.list, function(x)x$cl2) diff --git a/R/harmonize.R b/R/harmonize.R index 9561c5f..2fd0858 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -486,7 +486,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= #' @examples sim_knn <- function(sim, k=15) { - + require(matrixStats) th = rowOrderStats(as.matrix(sim), which=ncol(sim)-k+1) select = sim >= th knn.idx = t(apply(select, 1, function(x)head(which(x),k))) diff --git a/R/heatmap.R b/R/heatmap.R index 05dc440..226ec39 100644 --- a/R/heatmap.R +++ b/R/heatmap.R @@ -452,7 +452,7 @@ heatmap.3 <- function (x, lmat <- rbind(lmat[1, ] + 1, c(NA, 1), lmat[2, ] + 1) nnn <- ifelse(is.vector(ColSideColors), 1, - nrow(colSideColors)) + nrow(ColSideColors)) lhei <- c(lhei[1], nnn * 0.1, lhei[2]) } if (!missing(RowSideColors)) { @@ -784,4 +784,4 @@ heatmap.3 <- function (x, retval$colorTable <- data.frame(low = retval$breaks[-length(retval$breaks)], high = retval$breaks[-1], color = retval$col) invisible(retval) -} \ No newline at end of file +} diff --git a/R/markers.R b/R/markers.R index 3fab425..89632b1 100644 --- a/R/markers.R +++ b/R/markers.R @@ -12,22 +12,30 @@ #' @examples -select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) +select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1,...) { if(is.null(de.genes)){ de.genes=de_all_pairs(norm.dat, cl, ...) } - pairs = names(de.genes) - pairs.df = gsub("cl","", do.call("rbind",strsplit(pairs, "_"))) - - row.names(pairs.df)=pairs - select.pairs = pairs[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] - de.markers = sapply(select.pairs, function(s){ - tmp = de.genes[[s]] - c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) - },simplify=F) + pairs.df = get_pairs(names(de.genes)) + select.pairs = row.names(pairs.df)[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] + if (mc.cores == 1) { + registerDoSEQ() + } + else { + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) + } + + de.markers = pvec(select.pairs, function(s){ + sapply(s, function(x){ + tmp = de.genes[[x]] + c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) + },simplify=F) + },mc.cores=mc.cores) markers = intersect(unlist(de.markers),row.names(norm.dat)) - return(list(markers=markers, de.genes=de.genes[select.pairs])) + return(list(markers=markers, de.genes=de.genes)) } #' Title @@ -41,34 +49,71 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, ...) #' @export #' #' @examples -get_gene_score <- function(de.genes,cl.means, top.n=50, max.num=1000,bin.th=4) +get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max.num=1000,bin.th=4, mc.cores=1) { - select.genes <- sapply(names(de.genes), function(p){ - de = de.genes[[p]] - pair = strsplit(p, "_") - x = pair[[1]] - y = pair[[2]] - lfc = cl.means[,x] - cl.means[,y] - up.genes = names(de$up.genes) - #Deal with pairs with too many DEX genes, include all binary markers - up.binary.genes = up.genes[lfc[up.genes] > bin.th] - up.genes=up.genes[up.genes %in% c(head(up.genes, top.n), up.binary.genes)] - down.genes = de$down.genes - down.binary.genes = down.genes[lfc[down.genes] < -bin.th] - down.genes=down.genes[down.genes %in% c(head(down.genes, top.n), down.binary.genes)] - list(up=up.genes, down=down.genes) - },simplify=F) - all.genes=unique(unlist(select.genes)) - up.gene.score = sapply(select.genes, function(x){ - tmp=match(all.genes, de$up) - tmp[is.na(tmp)]=max.num - tmp - }) - down.gene.score = sapply(select.genes, function(x){ - tmp=match(all.genes, de$down) - tmp[is.na(tmp)]=max.num - tmp - }) + require(Matrix) + require(doParallel) + if (mc.cores == 1) { + registerDoSEQ() + } + else { + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) + } + + if(is.null(all.genes)){ + all.genes <- pvec(names(de.genes), function(p){ + de = de.genes[[p]] + pair = strsplit(p, "_")[[1]] + x = pair[[1]] + y = pair[[2]] + lfc = cl.means[,x] - cl.means[,y] + up.genes = names(de$up.genes) + down.genes = names(de$down.genes) + #Deal with pairs with too many DEX genes, include all binary markers + up.binary.genes = up.genes[lfc[up.genes] > bin.th] + up.genes=up.genes[up.genes %in% c(head(up.genes, top.n), up.binary.genes)] + + down.binary.genes = down.genes[lfc[down.genes] < -bin.th] + down.genes=down.genes[down.genes %in% c(head(down.genes, top.n), down.binary.genes)] + list(up=up.genes, down=down.genes) + },mc.cores=mc.cores) + all.genes=unique(unlist(all.genes)) + } + up.gene.score = pvec(names(de.genes),function(x){ + mat=sapply(x, function(p){ + de = de.genes[[p]] + tmp= match(all.genes, head(names(de$up.genes),max.num)) + tmp[is.na(tmp)]=max.num + tmp = max.num - tmp + tmp + }) + mat = Matrix(mat, sparse=TRUE) + row.names(mat) = all.genes + mat + }, mc.cores=mc.cores) + if(is.list(up.gene.score)){ + up.gene.score = do.call("cbind",up.gene.score) + } + + down.gene.score = pvec(names(de.genes),function(x){ + mat=sapply(x, function(p){ + de = de.genes[[p]] + tmp= match(all.genes, head(names(de$up.genes),max.num)) + tmp[is.na(tmp)]=max.num + tmp = max.num - tmp + tmp[tmp < 0] = 0 + tmp + }) + mat = Matrix(mat, sparse=TRUE) + row.names(mat) = all.genes + mat + }, mc.cores=mc.cores) + if(is.list(down.gene.score)){ + down.gene.score = do.call("cbind",down.gene.score) + } + row.names(up.gene.score)=row.names(down.gene.score)= all.genes return(list(up.gene.score=up.gene.score, down.gene.score=down.gene.score)) } @@ -98,14 +143,13 @@ select_markers_pair <- function(de.genes, add.genes, cl.means, gene.score=NULL,r tmp=get_gene_score(de.genes,cl.means=cl.means, top.n=top.n, max.num=max.num,bin.th=4) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score - gene.score=pmin(up.gene.score, down.gene.score) + gene.score=pmax(up.gene.score, down.gene.score) row.names(gene.score)=row.names(up.gene.score) } select.genes = setdiff(row.names(gene.score),rm.genes) - gene.score= gene.score[select.genes,names(add.genes),drop=F] - final.genes=list() + gene.score= gene.score[,names(add.genes),drop=F] while(sum(add.genes)>0 & nrow(gene.score)>0){ - g = order(rowSums(gene.score))[1] + g = order(get_row_means(gene.score, select.genes, ),decreasing=T)[1] g.n = row.names(gene.score)[g] select.pair = colnames(gene.score)[gene.score[g, ]< top.n] add.genes[select.pair]= add.genes[select.pair]-1 @@ -113,7 +157,9 @@ select_markers_pair <- function(de.genes, add.genes, cl.means, gene.score=NULL,r de.genes.list[[p]]=union(de.genes.list[[p]],g.n) } add.genes = add.genes[add.genes > 0] - gene.score=gene.score[-g,names(add.genes),drop=F] + + gene.score=gene.score[,names(add.genes),drop=F] + select.genes = setdiff(select.genes, g) } return(de.genes.list) } @@ -151,12 +197,13 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up while((sum(add.up)+sum(add.down)>0) & length(select.genes)>0){ sc =0 if(length(add.up)>0){ - sc = rowSums(up.gene.score[select.genes, names(add.up),drop=F]) + sc = get_row_means(up.gene.score, select.genes, names(add.up)) } + if(length(add.down)>0){ - sc = sc+rowSums(down.gene.score[select.genes, names(add.down),drop=F]) + sc = sc+ get_row_means(down.gene.score, select.genes, names(add.down)) } - g = select.genes[ which.min(sc)] + g = select.genes[ which.max(sc)] select.up.pair = names(add.up)[up.gene.score[g,names(add.up)]< top.n] select.down.pair = names(add.down)[down.gene.score[g,names(add.down)]< top.n] if(length(select.up.pair) + length(select.down.pair)==0){ @@ -177,10 +224,10 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up if(length(select.genes)>0){ select = rep(TRUE,length(select.genes)) if(length(add.up)>0){ - select = rowSums(up.gene.score[select.genes,names(add.up),drop=F] < top.n)>0 + select = rowSums(up.gene.score[select.genes,names(add.up),drop=F] > 0)>0 } if(length(add.down)>0){ - select = select | rowSums(down.gene.score[select.genes,names(add.down),drop=F] < top.n)>0 + select = select | rowSums(down.gene.score[select.genes,names(add.down),drop=F] > 0)>0 } select.genes= select.genes[select] } @@ -223,17 +270,17 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max. tmp.up.gene.score = cbind(up.gene.score[,up.pairs,drop=F], down.gene.score[,down.pairs,drop=F]) tmp.down.gene.score = cbind(down.gene.score[,up.pairs,drop=F], up.gene.score[,down.pairs,drop=F]) - up.genes = row.names(tmp.up.gene.score)[head(order(rowSums(tmp.up.gene.score)), n.markers)] - down.genes = row.names(tmp.down.gene.score)[head(order(rowSums(tmp.down.gene.score)), n.markers)] + up.genes = row.names(tmp.up.gene.score)[head(order(rowSums(tmp.up.gene.score, decreasing=T)), n.markers)] + down.genes = row.names(tmp.down.gene.score)[head(order(rowSums(tmp.down.gene.score,dereasing=T)), n.markers)] - up.num = colSums(tmp.up.gene.score[up.genes,,drop=F] < max.num) - down.num = colSums(tmp.down.gene.score[down.genes,,drop=F] < max.num) + up.num = colSums(tmp.up.gene.score[up.genes,,drop=F] >0) + down.num = colSums(tmp.down.gene.score[down.genes,,drop=F] >0 ) total.num = up.num + down.num add.genes = setNames(rep(n.markers, ncol(tmp.up.gene.score)), colnames(tmp.up.gene.score)) - total.num add.genes = add.genes[add.genes > 0] - up.genes = up.genes[rowMins(tmp.up.gene.score[up.genes,,drop=F]) < max.num] - down.genes = down.genes[rowMins(tmp.down.gene.score[down.genes,,drop=F]) < max.num] + up.genes = up.genes[rowMins(tmp.up.gene.score[up.genes,,drop=F]) > 0 ] + down.genes = down.genes[rowMins(tmp.down.gene.score[down.genes,,drop=F]) > 0 ] genes = union(up.genes, down.genes) if(length(add.genes)>0){ tmp=select_markers_pair(add.genes= add.genes,de.genes= de.genes, gene.score=pmin(tmp.up.gene.score, tmp.down.gene.score), rm.genes=c(up.genes, down.genes),top.n=top.n) @@ -306,7 +353,7 @@ select_pos_markers <- function(de.genes, cl, cl.means, n.markers=3, default.mark row.names(pairs.df) = pairs pairs.df = pairs.df[pairs.df[,1]%in% levels(cl) & pairs.df[,2]%in% levels(cl),] if(is.null(up.gene.score) | is.null(down.gene.score)){ - tmp=get_gene_score(de.genes) + tmp=get_gene_score(de.genes, cl.means=cl.means) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score } @@ -314,6 +361,7 @@ select_pos_markers <- function(de.genes, cl, cl.means, n.markers=3, default.mark ###for each cluster, find markers that discriminate it from other types cl.markers <- sapply(levels(cl), function(tmp.cl){ + print(tmp.cl) up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) @@ -333,6 +381,42 @@ select_pos_markers <- function(de.genes, cl, cl.means, n.markers=3, default.mark },simplify=F) } + +select_top_pos_markers <- function(de.genes, cl, n.markers=3) + { + library(parallel) + pairs.df = get_pairs(names(de.genes)) + cl.df$markers="" + + library(doParallel) + if (mc.cores == 1) { + registerDoSEQ() + } + else { + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) + } + + ###for each cluster, find markers that discriminate it from other types + cl.markers <- pvec(levels(cl), function(x){ + sapply(x, function(tmp.cl){ + print(tmp.cl) + up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] + down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] + if(length(up.pairs)){ + sc = get_row_means(up.gene.score, select.col=up.pairs) + } + if(length(down.pairs)>0){ + sc = sc+ get_row_means(down.gene.score, select.col=down.pairs) + } + head(names(sort(sc,decreasing=T)), n.markers) + },simplify=F) + },mc.cores=mc.cores) + return(cl.markers) + } + + #' Title #' #' @param cl.dat diff --git a/R/merge_cl.R b/R/merge_cl.R index bddd2c1..ab35dee 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -81,7 +81,7 @@ merge_cl<- function(norm.dat, cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) } else{ - cl.rd = as.data.frame(get_cl_means(rd.dat.t,cl[names(cl) %in% colnames(rd.dat)])) + cl.rd = as.data.frame(get_cl_means(rd.dat.t,cl[names(cl) %in% colnames(rd.dat.t)])) } cl.size = table(cl) while(TRUE){ @@ -229,7 +229,7 @@ merge_cl<- function(norm.dat, else{ tmp.cl= cl } - de.genes = de_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param, cl.means=cl.means, cl.present=cl.present, cl.sqr.mans=cl.sqr.means) + de.genes = de_all_pairs(norm.dat, cl=tmp.cl, de.genes=de.genes, de.param=de.param, cl.means=cl.means, cl.present=cl.present, cl.sqr.means=cl.sqr.means) } markers = select_markers(norm.dat, cl, de.genes=de.genes, n.markers=50)$markers sc = sapply(de.genes, function(x){ diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 6685d48..5c4b857 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -43,22 +43,63 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln library(stats) pca = stats::prcomp(t(as.matrix(norm.dat[select.genes,sampled.cells])),tol=0.01) - pca.importance = summary(pca)$importance - v = pca.importance[2,] - - select= which((v - mean(v))/sd(v)>th) - tmp = head(select,max.pca) - if(length(tmp)==0){ + + #pca.importance = summary(pca)$importance + #v = pca.importance[2,] + #m = mean(tail(v, length(v))/2) + #sd = sd(tail(v, length(v))/2) + #z= (v - m)/sd + select = 1:min(max.pca,findElbowPoint(pca$sdev^2)) + if(length(select)==0){ return(NULL) } if(length(sampled.cells)< length(select.cells)){ - rot = pca$rotatio[,tmp,drop=F] + rot = pca$rotatio[,select,drop=F] tmp.dat = norm.dat[row.names(rot), select.cells,drop=F] - rd.dat = as.matrix(Matrix::t(tmp.dat) %*% rot) + rd.dat = as.matrix(crossprod(tmp.dat, rot)) } else{ - rd.dat=pca$x[,tmp,drop=F] + rd.dat=pca$x[,select,drop=F] } return(list(rd.dat=rd.dat, pca=pca)) } + +top_loading_genes <- function(rot,top.n=10) + { + top.genes= apply(rot, 2, function(x){ + tmp=head(order(abs(x),decreasing=T), top.n) + split(row.names(rot)[tmp], x[tmp]>0) + }) + } + + +###Taken from https://github.com/kevinblighe/PCAtools/blob/master/R/findElbowPoint.R +findElbowPoint <- function(variance) { + if (is.unsorted(-variance)) { + stop("'variance' should be sorted in decreasing order") + } + + # Finding distance from each point on the curve to the diagonal. + dy <- -diff(range(variance)) + dx <- length(variance) - 1 + l2 <- sqrt(dx^2 + dy^2) + dx <- dx/l2 + dy <- dy/l2 + + dy0 <- variance - variance[1] + dx0 <- seq_along(variance) - 1 + parallel.l2 <- sqrt((dx0 * dx)^2 + (dy0 * dy)^2) + normal.x <- dx0 - dx * parallel.l2 + normal.y <- dy0 - dy * parallel.l2 + normal.l2 <- sqrt(normal.x^2 + normal.y^2) + + #Picking the maximum normal that lies below the line. + #If the entire curve is above the line, we just pick the last point. + below.line <- normal.x < 0 & normal.y < 0 + if (!any(below.line)) { + length(variance) + } else { + which(below.line)[which.max(normal.l2[below.line])] + } +} diff --git a/R/util.R b/R/util.R index 2a1cb1b..fb44299 100644 --- a/R/util.R +++ b/R/util.R @@ -279,6 +279,23 @@ get_cl_sums <- function(mat, return(cl.sums) } +###Get row means without subsetting the matrix +get_row_sums <- function(mat, select.row=1:nrow(mat), select.col=1:ncol(mat)) + { + if(!is.integer(select.col)){ + select.col = match(select.col, colnames(mat)) + } + tmp.mat = Matrix::sparseMatrix(x = 1, j= select.col, i = rep(1,length(select.col)),dims=c(1, ncol(mat))) + sums = Matrix::tcrossprod(mat,tmp.mat) + sums[select.row,] + } + +get_row_means <- function(mat, select.row=1:nrow(mat), select.col=1:ncol(mat)) + { + sums = get_row_sums(mat, select.row, select.col) + sums/ length(select.col) + } + #' Compute cluster means for each row in a matrix #' #' @param mat A gene (rows) x samples (columns) sparse matrix @@ -378,7 +395,7 @@ get_cl_medians <- function(mat, cl) #' get_cl_prop <- function(mat, cl, - threshold = 1) { + threshold = 0) { cl.mat <- get_cl_mat(cl) From 9990583c5c62492cd890767b6cf78914fff30502 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 26 Jun 2020 10:06:10 -0700 Subject: [PATCH 07/70] Fix name space issue --- R/markers.R | 105 +++++++++++++++++++++------------------- R/reduceDimension_PCA.R | 2 +- R/util.R | 2 +- 3 files changed, 58 insertions(+), 51 deletions(-) diff --git a/R/markers.R b/R/markers.R index 89632b1..4c8a6ae 100644 --- a/R/markers.R +++ b/R/markers.R @@ -100,7 +100,7 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max down.gene.score = pvec(names(de.genes),function(x){ mat=sapply(x, function(p){ de = de.genes[[p]] - tmp= match(all.genes, head(names(de$up.genes),max.num)) + tmp= match(all.genes, head(names(de$down.genes),max.num)) tmp[is.na(tmp)]=max.num tmp = max.num - tmp tmp[tmp < 0] = 0 @@ -197,15 +197,19 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up while((sum(add.up)+sum(add.down)>0) & length(select.genes)>0){ sc =0 if(length(add.up)>0){ - sc = get_row_means(up.gene.score, select.genes, names(add.up)) + sc = get_row_sums(up.gene.score, select.genes, names(add.up)) } - if(length(add.down)>0){ - sc = sc+ get_row_means(down.gene.score, select.genes, names(add.down)) + sc = sc+ get_row_sums(down.gene.score, select.genes, names(add.down)) } - g = select.genes[ which.max(sc)] - select.up.pair = names(add.up)[up.gene.score[g,names(add.up)]< top.n] - select.down.pair = names(add.down)[down.gene.score[g,names(add.down)]< top.n] + sc = sc[sc > 0] + ##No more genes to choose from + if(length(sc)==0){ + break + } + g = names(sc)[ which.max(sc)] + select.up.pair = names(add.up)[up.gene.score[g,names(add.up)] > 0] + select.down.pair = names(add.down)[down.gene.score[g,names(add.down)] > 0] if(length(select.up.pair) + length(select.down.pair)==0){ break } @@ -221,16 +225,6 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up } final.genes=c(final.genes, g) select.genes = setdiff(select.genes, final.genes) - if(length(select.genes)>0){ - select = rep(TRUE,length(select.genes)) - if(length(add.up)>0){ - select = rowSums(up.gene.score[select.genes,names(add.up),drop=F] > 0)>0 - } - if(length(add.down)>0){ - select = select | rowSums(down.gene.score[select.genes,names(add.down),drop=F] > 0)>0 - } - select.genes= select.genes[select] - } cat(g, length(add.up), length(add.down),"\n") } markers= final.genes @@ -346,48 +340,61 @@ select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.s #' @export #' #' @examples -select_pos_markers <- function(de.genes, cl, cl.means, n.markers=3, default.markers=NULL, rm.genes=NULL, up.gene.score=NULL, down.gene.score=NULL) +select_pos_markers <- function(de.genes, cl, cl.means=NULL, n.markers=3, default.markers=NULL, rm.genes=NULL, up.gene.score=NULL, down.gene.score=NULL,mc.cores=1) { - pairs = names(de.genes) - pairs.df = as.data.frame(do.call("rbind", strsplit(pairs, "_"))) - row.names(pairs.df) = pairs - pairs.df = pairs.df[pairs.df[,1]%in% levels(cl) & pairs.df[,2]%in% levels(cl),] + require("doParallel") + if(!is.null(de.genes)){ + pairs.df = get_pairs(names(de.genes)) + } + else if(!is.null(up.gene.score)){ + pairs.df = get_pairs(colnames(up.gene.score)) + }else{ + stop("both de.genes and up.gene.score are null") + } if(is.null(up.gene.score) | is.null(down.gene.score)){ tmp=get_gene_score(de.genes, cl.means=cl.means) up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score } cl.df$markers="" - -###for each cluster, find markers that discriminate it from other types - cl.markers <- sapply(levels(cl), function(tmp.cl){ - print(tmp.cl) - up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] - down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] - add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) - add.down = setNames(rep(n.markers, length(down.pairs)), down.pairs) - - up.default = sapply(up.pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) - down.default = sapply(down.pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) - if(length(up.default)>0){ - add.up = pmax(add.up - sapply(up.default, length),0) - } - if(length(down.default)>0){ - add.down = pmax(add.down - sapply(down.default, length),0) - } - tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, cl.means=cl.means, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) - - unique(c(tmp.result$markers, unlist(up.default), unlist(down.default))) - },simplify=F) + if (mc.cores == 1) { + registerDoSEQ() + } + else { + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) + } + + ###for each cluster, find markers that discriminate it from other types + cl.markers <- pvec(levels(cl), function(x){ + sapply(x, function(tmp.cl){ + cat("Cl\n",tmp.cl,"\n") + up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] + down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] + add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) + add.down = setNames(rep(n.markers, length(down.pairs)), down.pairs) + + up.default = sapply(up.pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) + down.default = sapply(down.pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) + if(length(up.default)>0){ + add.up = pmax(add.up - sapply(up.default, length),0) + } + if(length(down.default)>0){ + add.down = pmax(add.down - sapply(down.default, length),0) + } + tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, cl.means=cl.means, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) + unique(c(tmp.result$markers, unlist(up.default), unlist(down.default))) + },simplify=F) + },mc.cores=mc.cores) + return(cl.markers) } -select_top_pos_markers <- function(de.genes, cl, n.markers=3) +select_top_pos_markers <- function(de.genes, cl, n.markers=3, up.gene.score, down.gene.score,mc.cores=10) { library(parallel) - pairs.df = get_pairs(names(de.genes)) - cl.df$markers="" - + pairs.df = get_pairs(names(de.genes)) library(doParallel) if (mc.cores == 1) { registerDoSEQ() @@ -405,10 +412,10 @@ select_top_pos_markers <- function(de.genes, cl, n.markers=3) up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] if(length(up.pairs)){ - sc = get_row_means(up.gene.score, select.col=up.pairs) + sc = get_row_sums(up.gene.score, select.col=up.pairs) } if(length(down.pairs)>0){ - sc = sc+ get_row_means(down.gene.score, select.col=down.pairs) + sc = sc+ get_row_sums(down.gene.score, select.col=down.pairs) } head(names(sort(sc,decreasing=T)), n.markers) },simplify=F) diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 5c4b857..4489dd2 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -56,7 +56,7 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln if(length(sampled.cells)< length(select.cells)){ rot = pca$rotatio[,select,drop=F] tmp.dat = norm.dat[row.names(rot), select.cells,drop=F] - rd.dat = as.matrix(crossprod(tmp.dat, rot)) + rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) } else{ rd.dat=pca$x[,select,drop=F] diff --git a/R/util.R b/R/util.R index fb44299..b3501c2 100644 --- a/R/util.R +++ b/R/util.R @@ -224,7 +224,7 @@ convert_pair_matrix_str <- function(pair.str, get_weighted_means <- function(mat, w) { - rowSums(tcrossprod(mat,diag(w)))/sum(w) + rowSums(Matrix::tcrossprod(mat,diag(w)))/sum(w) } #' Generate a sparse matrix one-hot representation of clusters x samples From 4fcc07854f7909e77ee271d030ace242a45026b7 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Thu, 9 Jul 2020 14:19:32 -0700 Subject: [PATCH 08/70] Restructure code --- R/merge_cl.R | 9 ++++---- R/reduceDimension_PCA.R | 51 ++++++++++++++++++++++++++++------------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/R/merge_cl.R b/R/merge_cl.R index ab35dee..ed7b60e 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -117,10 +117,11 @@ merge_cl<- function(norm.dat, cl.rd[[p[2]]] = NULL cl.size[p[1]] = sum(cl.size[p]) cl.size = cl.size[names(cl.size)!=p[2]] - } - cl.means = as.data.frame(get_cl_means(norm.dat, cl)) - cl.present = as.data.frame(get_cl_present(norm.dat, cl,low.th=de.param$low.th)) - cl.sqr.means = as.data.frame(get_cl_sqr_means(norm.dat,cl)) + } + tmp.cl = cl[names(cl) %in% colnames(norm.dat)] + cl.means = as.data.frame(get_cl_means(norm.dat, tmp.cl)) + cl.present = as.data.frame(get_cl_present(norm.dat, tmp.cl,low.th=de.param$low.th)) + cl.sqr.means = as.data.frame(get_cl_sqr_means(norm.dat,tmp.cl)) while(length(unique(cl)) > 1){ if(length(unique(cl)) == 2){ diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 4489dd2..816e2c6 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -1,4 +1,5 @@ -#' prcomp irlba + + #' prcomp irlba #' #' @param x #' @param max.rank @@ -37,33 +38,51 @@ prcomp.irlba <- function(x, max.rank=500, maxit=1000, tol=1e-05, center=TRUE,... #' @export #' #' @examples -rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2) +rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2, verbose=FALSE) { library(Matrix) library(stats) - - pca = stats::prcomp(t(as.matrix(norm.dat[select.genes,sampled.cells])),tol=0.01) - #pca.importance = summary(pca)$importance - #v = pca.importance[2,] - #m = mean(tail(v, length(v))/2) - #sd = sd(tail(v, length(v))/2) - #z= (v - m)/sd - select = 1:min(max.pca,findElbowPoint(pca$sdev^2)) - if(length(select)==0){ + tmp = get_PCA(norm.dat[select.genes, sampled.cells], max.pca, verbose=verbose) + if(is.null(tmp)){ return(NULL) } + rot = tmp$rot + rd.dat = tmp$rd.dat if(length(sampled.cells)< length(select.cells)){ - rot = pca$rotatio[,select,drop=F] + if(verbose){ + print("Project") + } tmp.dat = norm.dat[row.names(rot), select.cells,drop=F] - rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) - } - else{ - rd.dat=pca$x[,select,drop=F] + rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) } return(list(rd.dat=rd.dat, pca=pca)) } + +get_PCA <- function(dat, max.pca, verbose=FALSE) + { + library(Matrix) + library(stats) + + pca = stats::prcomp(t(as.matrix(dat)),tol=0.01) + dim.elbow = findElbowPoint(pca$sdev^2) + if(verbose){ + cat("Elbow dim:", dim.elbow, "\n") + } + select = 1:min(max.pca,dim.elbow) + if(length(select)==0){ + return(NULL) + } + rot = pca$rotatio[,select,drop=F] + rd.dat = pca$x[,select,drop=F] + return(list(rot=rot, rd.dat = rd.dat,pca=pca)) + } + + + + + top_loading_genes <- function(rot,top.n=10) { top.genes= apply(rot, 2, function(x){ From ef8e416ee8ba5991352bf70559661dc48fec08c5 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 10 Jul 2020 16:06:07 -0700 Subject: [PATCH 09/70] propagate the changes in de_genes functions --- R/harmonize.R | 4 ++-- R/harmonize_merge.R | 33 ++++++++++++++++++++------------- R/harmonize_util.R | 41 ++++++++++++++++++++++++++--------------- 3 files changed, 48 insertions(+), 30 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index 2fd0858..90cdbfc 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -635,9 +635,9 @@ i_harmonize <- function(comb.dat, select.cells=comb.dat$all.cells, ref.sets=name sets = names(platform.size) - pass.th = sapply(sets, function(set)platform.size[[set]] >= de.param.list[[set]]$min.cells) + pass.th = sapply(ref.sets, function(set)platform.size[[set]] >= de.param.list[[set]]$min.cells) pass.th2 = sapply(sets, function(set)platform.size[[set]] >= de.param.list[[set]]$min.cells*2) - if(sum(pass.th) == length(ref.sets) & sum(pass.th2) >= 1){ + if(sum(pass.th) >= length(ref.sets) & sum(pass.th2) >= 1){ tmp.result = i_harmonize(comb.dat, select.cells=select.cells, ref.sets=ref.sets, prefix=tmp.prefix, overwrite=overwrite, ...) } else{ diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 8e13954..325f411 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -42,7 +42,8 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means if(nrow(tmp.pairs)==0){ next } - de.genes.list[[x]] = c(de.genes.list[[x]], de_selected_pairs(norm.dat, cl= tmp.cl, pairs = tmp.pairs, de.param=de.param, method=method,cl.means=cl.means.list[[x]], cl.present = cl.present.list[[x]], cl.sqr.means=cl.sqr.means.list[[x]])) + tmp = de_selected_pairs(norm.dat, cl= tmp.cl, pairs = tmp.pairs, de.param=de.param.list[[x]], method=method,cl.means=cl.means.list[[x]], cl.present = cl.present.list[[x]], cl.sqr.means=cl.sqr.means.list[[x]]) + de.genes.list[[x]] = c(de.genes.list[[x]], tmp) } for(p in row.names(pairs)){ lfc = sapply(names(cl.means.list), function(x){ @@ -53,7 +54,10 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means NULL } }) - lfc = as.matrix(lfc) + if(is.list(lfc)){ + lfc = lfc[!sapply(lfc,is.null)] + lfc = do.call("cbind",lfc) + } row.names(lfc) = comb.dat$common.genes sign1 = rowSums(lfc > 1) sign2 = rowSums(lfc < -1) @@ -63,8 +67,8 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means if(is.null(de.genes.list[[x]][[p]])){ next } - up.genes = de.genes.list[[p]]$up.genes - down.genes = de.genes.list[[p]]$down.genes + up.genes = de.genes.list[[x]][[p]]$up.genes + down.genes = de.genes.list[[x]][[p]]$down.genes up.genes = up.genes[names(up.genes) %in% select.genes] down.genes = down.genes[names(down.genes) %in% select.genes] tmp = up.genes @@ -72,7 +76,7 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means up.score <- sum(tmp) tmp = down.genes tmp[tmp > 20] = 20 - down.score <- sum(down) + down.score <- sum(tmp) de.genes.list[[x]][[p]]=list( up.score = up.score, @@ -80,7 +84,7 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means score = up.score + down.score, up.num = length(up.genes), down.num = length(down.genes), - num = up.num + down.num + num = length(up.genes) + length(down.genes) ) } @@ -161,7 +165,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo { print("merge_cl_multiple") cl = setNames(as.character(cl),names(cl)) - merge_x_y <- function(x, y, cl, cl.rd.list, cl.sim, cl.means.list=NULL, cl.present.list=NULL) + merge_x_y <- function(x, y) { cl[cl==x]= y if(length(unique(cl))==1){ @@ -212,6 +216,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } if(!is.null(cl.present.list)){ + tmp = colnames(cl.present.list[[set]])!=x cl.present.list[[set]] = cl.present.list[[set]][,tmp,drop=F] tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F] >= merge.de.param.list[[set]]$low.th) @@ -305,7 +310,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo return(NULL) } #cl.rd.list = get_cl_means_list(merge.dat.list, merge.de.param.list, select.genes=anchor.genes, cl=cl) - cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, select.genes=anchor.genes) + cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, select.genes=anchor.genes, de.param.list = merge.de.param.list) pairs=NULL ###Merge small clusters first @@ -319,7 +324,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if(verbose > 0){ cat("Merge: ", x,y, "sim:", knn[closest.pair,3],"\n") } - update.result=merge_x_y(x, y, cl, cl.rd.list, cl.sim) + update.result=merge_x_y(x, y) if(is.null(update.result)){ return(NULL) } @@ -328,17 +333,18 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.sim = update.result$cl.sim cl.means.list = update.result$cl.means.list cl.present.list = update.result$cl.present.list + cl.sqr.means.list = update.result$cl.sqr.means.list cl.small = cl.small[cl.small!=x] } merge.de.param.list = comb.dat$de.param.list[merge.sets] - cl.means.list = get_cl_means_list(merge.dat.list, merge.de.param.list, cl=cl) + cl.means.list = get_cl_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) cl.means.list = sapply(cl.means.list, as.data.frame, simplify=F) - cl.sqr.means.list = get_cl_sqr_means_list(merge.dat.list, merge.de.param.list, cl=cl) + cl.sqr.means.list = get_cl_sqr_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) cl.sqr.means.list = sapply(cl.sqr.means.list, as.data.frame, simplify=F) - cl.present.list = get_cl_present_list(merge.dat.list,merge.de.param.list, cl=cl) + cl.present.list = get_cl_present_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) cl.present.list = sapply(cl.present.list, as.data.frame, simplify=F) @@ -395,7 +401,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if (verbose > 0) { cat("Merge ", x, y, merge.sc[i], sim, sum(cl == x), "cells", sum(cl == y), "cells", "\n") } - update.result=merge_x_y(x=x, y=y, cl, cl.rd.list, cl.sim, cl.means.list, cl.present.list) + update.result=merge_x_y(x=x, y=y) if(is.null(update.result)){ return(NULL) } @@ -404,6 +410,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.sim = update.result$cl.sim cl.means.list = update.result$cl.means.list cl.present.list = update.result$cl.present.list + cl.sqr.means.list = update.result$cl.sqr.means.list rm.pairs = de.pairs[, 1] %in% c(x,y) | de.pairs[, 2] %in% c(x,y) de.genes.list = rm_pairs_de_genes(de.genes.list, row.names(de.pairs)[rm.pairs]) de.pairs = de.pairs[!rm.pairs,,drop=F] diff --git a/R/harmonize_util.R b/R/harmonize_util.R index c9485cb..4826cd2 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -149,6 +149,9 @@ get_cl_means_list <- function(dat.list, cl, de.param.list=NULL, min.cells=NULL, min.cells = setNames(rep(min.cells, length(dat.list)), names(dat.list)) } } + if(is.null(min.cells)){ + min.cells = setNames(rep(1, length(dat.list)), names(dat.list)) + } cl.means.list = list() for(x in sets){ tmp.cells = intersect(names(cl), colnames(dat.list[[x]])) @@ -225,18 +228,27 @@ get_cl_sqr_means_list <- function(dat.list, cl, de.param.list=NULL, min.cells=NU #' @export #' #' @examples -get_cl_present_list <- function(dat.list, de.param.list, select.genes=NULL, cl, sets=names(dat.list)) +get_cl_present_list <- function(dat.list, de.param.list=NULL, min.cells=NULL, select.genes=NULL, cl, sets=names(dat.list)) { - cl.present = sapply(sets, function(x){ - tmp.cells = intersect(names(cl), colnames(dat.list[[x]])) - tmp.cl = cl[tmp.cells] - cl.size = table(tmp.cl) - if(!is.null(de.param.list[[x]])){ - select.cl = names(cl.size)[cl.size >= de.param.list[[x]]$min.cells] + if(is.null(min.cells)){ + if(!is.null(de.param.list)){ + min.cells = lapply(de.param.list,"[[", "min.cells") } else{ - select.cl = names(cl.size)[cl.size >= 4] + min.cells = setNames(rep(1, length(dat.list)), names(dat.list)) + } + } + else{ + if(length(min.cells) ==1){ + min.cells = setNames(rep(min.cells, length(dat.list)), names(dat.list)) } + } + cl.present.list = list() + for(x in sets){ + tmp.cells = intersect(names(cl), colnames(dat.list[[x]])) + tmp.cl = cl[tmp.cells] + cl.size = table(tmp.cl) + select.cl = names(cl.size)[cl.size >= min.cells[[x]]] if(length(select.cl)==0){ return(NULL) } @@ -244,14 +256,13 @@ get_cl_present_list <- function(dat.list, de.param.list, select.genes=NULL, cl, if(is.factor(tmp.cl)){ tmp.cl=droplevels(tmp.cl) } - if(is.null(select.genes)){ - tmp=get_cl_means(dat.list[[x]] > de.param.list[[x]]$low.th, tmp.cl) + tmp=get_cl_present(dat.list[[x]], tmp.cl, de.param.list$low.th) + if(!is.null(select.genes)){ + tmp=tmp[select.genes,,drop=F] } - else{ - tmp=get_cl_means(dat.list[[x]][select.genes,] > de.param.list[[x]]$low.th, tmp.cl) - } - },simplify=F) - return(cl.present) + cl.present.list[[x]]= tmp + } + return(cl.present.list) } From 6a3c0a5683fa77439a2bfd890e73cf365db8c980 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 10 Jul 2020 16:41:45 -0700 Subject: [PATCH 10/70] bug fix --- DESCRIPTION | 14 +++++++++----- R/de.genes.R | 4 +++- R/reduceDimension_PCA.R | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bcce672..b108cd4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,15 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.0 +Version: 1.0.1 Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), person("Cindy", "van Velthoven", email = "cindy.vanvelthoven@alleninstitute.org", role = c("aut")), person("Jeremy", "Miller", email = "jeremym@alleninstitute.org", role = c("aut")), + + + + person("Adriana","Sedeno-Cortes", email ="adrianas@alleninstitute.org", role = c("aut")), person("Changkyu","Lee", email="Changkyul@alleninstitute.org", role = c("aut")), person("Lawrence","Huang", email="lawrenceh@alleninstitute.org", role = c("aut")), @@ -28,13 +32,13 @@ Imports: foreach, ggplot2, grid, - limma, + Matrix, matrixStats, pvclust, qlcMatrix, - Rtsne, - WGCNA -Suggests: + Rtsne +Suggests: + WGCNA, knitr, rmarkdown, testthat, diff --git a/R/de.genes.R b/R/de.genes.R index 79e513b..696772c 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -631,6 +631,7 @@ de_pair_fast_limma <- function(pair, } if(method == "limma"){ + require("limma") norm.dat <- as.matrix(norm.dat[, names(cl)]) cl <- setNames(as.factor(paste0("cl",cl)),names(cl)) design <- model.matrix(~0 + cl) @@ -655,11 +656,11 @@ de_pair_fast_limma <- function(pair, if(nrow(pairs)< 50){ mc.cores=1 } - library(doParallel) if (mc.cores == 1) { registerDoSEQ() } else { + rquire("doParallel") Clu <- makeForkCluster(mc.cores) doParallel::registerDoParallel(Clu) on.exit(parallel::stopCluster(Clu), add = TRUE) @@ -668,6 +669,7 @@ de_pair_fast_limma <- function(pair, de_list = pvec(1:nrow(pairs), function(x){ sapply(x, function(i){ if(method == "limma") { + require("limma") df= de_pair_limma(pair = pairs[i,], cl.present = cl.present, cl.means = cl.means, diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 816e2c6..aaada89 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -49,6 +49,7 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln } rot = tmp$rot rd.dat = tmp$rd.dat + pca = tmp$pca if(length(sampled.cells)< length(select.cells)){ if(verbose){ print("Project") From 13e4cb7c0741ca0ae571963e9b77f17cac9033a7 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 10 Jul 2020 16:46:00 -0700 Subject: [PATCH 11/70] fix typo --- DESCRIPTION | 4 ---- 1 file changed, 4 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b108cd4..fe97222 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -6,10 +6,6 @@ Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), person("Cindy", "van Velthoven", email = "cindy.vanvelthoven@alleninstitute.org", role = c("aut")), person("Jeremy", "Miller", email = "jeremym@alleninstitute.org", role = c("aut")), - - - - person("Adriana","Sedeno-Cortes", email ="adrianas@alleninstitute.org", role = c("aut")), person("Changkyu","Lee", email="Changkyul@alleninstitute.org", role = c("aut")), person("Lawrence","Huang", email="lawrenceh@alleninstitute.org", role = c("aut")), From 964497bd7d2e655c834f40b5d0efcec1bec9900e Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 10 Jul 2020 23:00:06 -0700 Subject: [PATCH 12/70] Bug fix --- R/harmonize.R | 2 +- R/harmonize_merge.R | 3 +++ R/harmonize_util.R | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index 90cdbfc..373503b 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -428,7 +428,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= sampled.cells = unlist(cells.list) result = knn_jaccard_louvain(knn.comb[sampled.cells,]) - result$cl.mat = t(result$memberships) + result$cl.mat = as.matrix(t(result$memberships)) row.names(result$cl.mat) = sampled.cells result$knn = knn.comb cl = setNames(result$cl.mat[,1], row.names(result$cl.mat)) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 325f411..292f280 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -58,6 +58,9 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means lfc = lfc[!sapply(lfc,is.null)] lfc = do.call("cbind",lfc) } + if(is.null(lfc)){ + return(NULL) + } row.names(lfc) = comb.dat$common.genes sign1 = rowSums(lfc > 1) sign2 = rowSums(lfc < -1) diff --git a/R/harmonize_util.R b/R/harmonize_util.R index 4826cd2..f3c1c61 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -256,7 +256,7 @@ get_cl_present_list <- function(dat.list, de.param.list=NULL, min.cells=NULL, se if(is.factor(tmp.cl)){ tmp.cl=droplevels(tmp.cl) } - tmp=get_cl_present(dat.list[[x]], tmp.cl, de.param.list$low.th) + tmp=get_cl_present(dat.list[[x]], tmp.cl, de.param.list[[x]]$low.th) if(!is.null(select.genes)){ tmp=tmp[select.genes,,drop=F] } From 8902bd9f0c9ab2c8e5767eecc8f388e2ab10a8fb Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Thu, 16 Jul 2020 22:52:48 -0700 Subject: [PATCH 13/70] Fix typo --- R/de.genes.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/de.genes.R b/R/de.genes.R index 696772c..d7bdd89 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -660,7 +660,7 @@ de_pair_fast_limma <- function(pair, registerDoSEQ() } else { - rquire("doParallel") + require("doParallel") Clu <- makeForkCluster(mc.cores) doParallel::registerDoParallel(Clu) on.exit(parallel::stopCluster(Clu), add = TRUE) From c55c69a1dba76313a3aaab5771e6486dc7b20518 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 17 Jul 2020 13:42:19 -0700 Subject: [PATCH 14/70] Add back the zscore method for determine the maximum number of PCs --- R/cluster.R | 4 ++++ R/harmonize_util.R | 2 +- R/reduceDimension_PCA.R | 27 +++++++++++++++++---------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/R/cluster.R b/R/cluster.R index 7cf67df..8967290 100644 --- a/R/cluster.R +++ b/R/cluster.R @@ -94,6 +94,10 @@ filter_RD <- function(rd.dat, rm.eigen, rm.th, verbose=FALSE) rm.cor=cor(rd.dat, rm.eigen[row.names(rd.dat),]) rm.cor[is.na(rm.cor)]=0 rm.score = rowMaxs(abs(rm.cor)) + if(verbose){ + print("rm score") + print(tail(sort(rm.score))) + } select = colSums(t(abs(rm.cor)) >= rm.th) ==0 if(sum(!select)>0 & verbose){ print("Remove dimension:") diff --git a/R/harmonize_util.R b/R/harmonize_util.R index f3c1c61..3538ec0 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -159,7 +159,7 @@ get_cl_means_list <- function(dat.list, cl, de.param.list=NULL, min.cells=NULL, cl.size = table(tmp.cl) select.cl = names(cl.size)[cl.size >= min.cells[[x]]] if(length(select.cl)==0){ - return(NULL) + next } tmp.cl = tmp.cl[tmp.cl %in% select.cl] if(is.factor(tmp.cl)){ diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index aaada89..ccfb1e2 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -38,12 +38,12 @@ prcomp.irlba <- function(x, max.rank=500, maxit=1000, tol=1e-05, center=TRUE,... #' @export #' #' @examples -rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2, verbose=FALSE) +rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2, verbose=FALSE, method="zscore") { library(Matrix) library(stats) - tmp = get_PCA(norm.dat[select.genes, sampled.cells], max.pca, verbose=verbose) + tmp = get_PCA(norm.dat[select.genes, sampled.cells], max.pca=max.pca, verbose=verbose,th=th, method=method) if(is.null(tmp)){ return(NULL) } @@ -60,18 +60,27 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln return(list(rd.dat=rd.dat, pca=pca)) } - -get_PCA <- function(dat, max.pca, verbose=FALSE) +get_PCA <- function(dat, max.pca, verbose=FALSE, method="zscore",th=2) { library(Matrix) library(stats) pca = stats::prcomp(t(as.matrix(dat)),tol=0.01) - dim.elbow = findElbowPoint(pca$sdev^2) - if(verbose){ - cat("Elbow dim:", dim.elbow, "\n") + if(method=="elbow"){ + dim.elbow = findElbowPoint(pca$sdev^2) + if(verbose){ + cat("elbow dim:", dim.elbow, "\n") + } + select = 1:min(max.pca,dim.elbow) + } + else if(method=="zscore"){ + v = pca.importance[2,] + select= which((v - mean(v))/sd(v)>th) + select = head(select,max.pca) + } + else{ + Stop("Unknown method") } - select = 1:min(max.pca,dim.elbow) if(length(select)==0){ return(NULL) } @@ -82,8 +91,6 @@ get_PCA <- function(dat, max.pca, verbose=FALSE) - - top_loading_genes <- function(rot,top.n=10) { top.genes= apply(rot, 2, function(x){ From 27ea8b8de29c12ac5a7508bb1b329057f28fb4fc Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 17 Jul 2020 22:28:28 -0700 Subject: [PATCH 15/70] Bug fix --- R/harmonize_merge.R | 8 +++----- R/harmonize_util.R | 9 ++++----- R/reduceDimension_PCA.R | 1 + 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 292f280..809b221 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -203,7 +203,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } - if(!is.null(cl.sqr.means.list) & de.method=="fast_limma"){ + if(!is.null(cl.sqr.means.list) & !is.null(cl.sqr.means.list[[set]]) & de.method=="fast_limma"){ tmp = colnames(cl.sqr.means.list[[set]])!=x cl.sqr.means.list[[set]] = cl.sqr.means.list[[set]][,tmp,drop=F] tmp.sqr.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]^2) @@ -217,9 +217,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } - - if(!is.null(cl.present.list)){ - + if(!is.null(cl.present.list) & !is.null(cl.present.list[[set]])){ tmp = colnames(cl.present.list[[set]])!=x cl.present.list[[set]] = cl.present.list[[set]][,tmp,drop=F] tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F] >= merge.de.param.list[[set]]$low.th) @@ -378,7 +376,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo de.pairs = rbind(merge.pairs[new.pairs,],de.pairs) } de.genes.list = add_pairs_de_genes(de.genes.list, cl, merge.pairs[new.pairs,]) - if(sum(sapply(de.genes.list, length))==0){ + if(is.null(de.genes.list) || sum(sapply(de.genes.list, length))==0){ return(NULL) } merge.sc = test_merge_multiple(de.genes.list, merge.type=merge.type) diff --git a/R/harmonize_util.R b/R/harmonize_util.R index 3538ec0..e7aeeb6 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -378,10 +378,9 @@ comb_de_result <- function(de.genes.list, cl.means.list, common.genes=NULL, max. } de.genes = list() for(p in pairs){ - print(p) de.counts = table(unlist(lapply(names(de.genes.list), function(set){ de = de.genes.list[[set]][[p]] - de$genes}))) + c(names(de$up.genes),names(de$down.genes))}))) g = intersect(names(de.counts), comb.dat$common.genes) pair = unlist(strsplit(p,"_")) lfc = lapply(sets, function(set){ @@ -403,8 +402,8 @@ comb_de_result <- function(de.genes.list, cl.means.list, common.genes=NULL, max. rank = do.call("cbind",lapply(names(de.genes.list), function(set){ de = de.genes.list[[set]][[p]] - tmp1=match(g, de$up.genes) - tmp2=match(g, de$down.genes) + tmp1=match(g, names(de$up.genes)) + tmp2=match(g, names(de$down.genes)) tmp1[is.na(tmp1)] = max.num tmp2[is.na(tmp2)] = max.num tmp = pmin(tmp1, tmp2) @@ -427,7 +426,7 @@ comb_de_result <- function(de.genes.list, cl.means.list, common.genes=NULL, max. up = row.names(df)[which(df$lfc > 0)] down = row.names(df)[which(df$lfc < 0)] select = c(up,down) - de.genes[[p]] = list(up.genes =up, down.genes=down, up.num = length(up),down.num=length(down),num=length(select),genes=select, de.df = df) + de.genes[[p]] = list(up.genes =setNames(df[up,"counts"], up), down.genes=setNames(df[down,"counts"], down), up.num = length(up),down.num=length(down),num=length(select),genes=select, de.df = df) } return(de.genes) } diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index ccfb1e2..39c7b5d 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -74,6 +74,7 @@ get_PCA <- function(dat, max.pca, verbose=FALSE, method="zscore",th=2) select = 1:min(max.pca,dim.elbow) } else if(method=="zscore"){ + pca.importance = summary(pca)$importance v = pca.importance[2,] select= which((v - mean(v))/sd(v)>th) select = head(select,max.pca) From 5c538f91b6a99c0d8b32b0e9e514ebbef8e5d90c Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 28 Aug 2020 22:02:39 -0700 Subject: [PATCH 16/70] Add package name to function call to reduce name conflict. Improve imputation efficiency --- R/KNN.graph.R | 50 +++++++------ R/consensusCluster.R | 29 +++++--- R/de.genes.R | 81 +++++++++++---------- R/dend.markers.R | 4 +- R/dendro.R | 8 +-- R/find_noise_cl.R | 16 +++-- R/harmonize.R | 41 +++++++++-- R/harmonize_impute.R | 151 ++++++++++++++++++++++++++++----------- R/harmonize_merge.R | 33 +++++---- R/harmonize_util.R | 12 ++-- R/markers.R | 36 ++++++---- R/reduceDimension_PCA.R | 12 +++- R/reduceDimension_plot.R | 101 +++++++++++++++++++++++--- 13 files changed, 402 insertions(+), 172 deletions(-) diff --git a/R/KNN.graph.R b/R/KNN.graph.R index b2fba9e..b115d9a 100644 --- a/R/KNN.graph.R +++ b/R/KNN.graph.R @@ -2,7 +2,6 @@ #' #' @param rd.dat #' @param cl -#' @param cl.df #' @param k #' @param knn.outlier.th #' @param outlier.frac.th @@ -11,33 +10,40 @@ #' @export #' #' @examples -get_knn_graph <- function(rd.dat, cl,cl.df, k=15, knn.outlier.th=2, outlier.frac.th=0.5) +get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0.5,clean.cells=row.names(rd.dat)) { + ##fast_knn does not always work for small clusters + #knn.result = fast_knn(rd.dat,k=k, ef=ef,M=M) knn.result = RANN::nn2(rd.dat,k=k) row.names(knn.result[[1]]) = row.names(knn.result[[2]])=row.names(rd.dat) knn = knn.result[[1]] knn.dist = knn.result[[2]] - cl.knn.dist.mean = tapply(names(cl),cl, function(x) mean(knn.dist[x,-1])) - cl.knn.dist.sd = tapply(names(cl),cl, function(x) sd(knn.dist[x,-1])) - cl.knn.dist.th = (cl.knn.dist.mean + knn.outlier.th * cl.knn.dist.sd) + knn.cl = matrix(cl[row.names(knn)[knn]],ncol=ncol(knn)) + row.names(knn.cl)= row.names(knn) + cl.knn.dist.med = tapply(clean.cells,cl[clean.cells], function(x) median(knn.dist[x,-1])) + cl.knn.dist.mad = tapply(clean.cells, cl[clean.cells], function(x) mad(knn.dist[x,-1])) + cl.knn.dist.th = cl.knn.dist.med + knn.outlier.th * cl.knn.dist.mad + cl.knn.dist.th = pmax(cl.knn.dist.th, median(cl.knn.dist.th)) knn.dist.th=cl.knn.dist.th[as.character(cl[row.names(knn)])] outlier = apply(knn.dist, 2, function(x) x> knn.dist.th) + outlier[!row.names(knn)[knn] %in% clean.cells]=TRUE row.names(outlier) = row.names(knn.dist) + outlier.frac= rowMeans(outlier) + knn[outlier] = NA - select.cells = row.names(outlier)[rowMeans(outlier) < outlier.frac.th] - pred.result = predict_knn(knn[select.cells,], row.names(rd.dat), cl) - pred.prob = pred.result$pred.prob - knn.cell.cl.counts = round(pred.prob * ncol(knn)) - knn.cl.cl.counts = do.call("rbind",tapply(row.names(pred.prob), cl[row.names(pred.prob)], function(x)colSums(knn.cell.cl.counts[x,]))) - knn.cl.df = as.data.frame(as.table(knn.cl.cl.counts)) - colnames(knn.cl.df)[1:2] = c("cl.from","cl.to") - from.size = rowSums(knn.cl.cl.counts) - to.size = colSums(knn.cl.cl.counts) - total = sum(knn.cl.cl.counts) + knn.cl[outlier] = NA + + select.cells = intersect(clean.cells, names(outlier.frac)[outlier.frac < outlier.frac.th]) + tmp.df = data.frame(sample_name =rep(select.cells, ncol(knn)), cl.to=as.vector(knn.cl[select.cells,])) + tmp.df$cl.from = cl[as.character(tmp.df$sample_name)] + knn.cl.df = tmp.df %>% filter(!is.na(cl.to)) %>% group_by(cl.from, cl.to) %>% summarise(Freq=n()) + + from.size = tapply(knn.cl.df$Freq, knn.cl.df$cl.from, sum) + to.size = tapply(knn.cl.df$Freq, knn.cl.df$cl.to, sum) + total = sum(knn.cl.df$Freq) knn.cl.df$cl.from.total= from.size[as.character(knn.cl.df$cl.from)] knn.cl.df$cl.to.total = to.size[as.character(knn.cl.df$cl.to)] - knn.cl.df = knn.cl.df[knn.cl.df$Freq > 0,] knn.cl.df$pval.log = knn.cl.df$odds = 0 for(i in 1:nrow(knn.cl.df)){ q = knn.cl.df$Freq[i] - 1 @@ -45,12 +51,10 @@ get_knn_graph <- function(rd.dat, cl,cl.df, k=15, knn.outlier.th=2, outlier.frac m = knn.cl.df$cl.to.total[i] n = total - m knn.cl.df$pval.log[i]=phyper(q, m=m, n=n, k=k, lower.tail = FALSE, log.p=TRUE) - knn.cl.df$odds[i] = (q + 1) / (k * m /total) + knn.cl.df$odds[i] = (q + 1) / (k /total * m) } knn.cl.df$frac = knn.cl.df$Freq/knn.cl.df$cl.from.total - knn.cl.df$cl.from.label = cl.df[as.character(knn.cl.df$cl.from),"cluster_label"] - knn.cl.df$cl.to.label = cl.df[as.character(knn.cl.df$cl.to),"cluster_label"] - return(list(knn.result=knn.result, pred.result=pred.result, knn.cl.df=knn.cl.df)) + return(list(knn.result=knn.result, pred.result=pred.result, knn.cl.df=knn.cl.df,outlier=outlier)) } @@ -568,8 +572,10 @@ if (exxageration !=1) { g2 <- gridExtra::arrangeGrob(grobs=list(dot.size.legend,edge.width.legend,cl.center.legend), layout_matrix=layout_legend) - - ggsave(file.path(out.dir,paste0(st,"constellation.pdf")),marrangeGrob(list(plot.all,g2),nrow = 1, ncol=1),width = plot.width, height = plot.height, units="cm",useDingbats=FALSE) + + fout = file.path(out.dir,paste0(st,"constellation.pdf")) + cat("Save ", fout, "\n") + ggsave(fout, marrangeGrob(list(plot.all,g2),nrow = 1, ncol=1),width = plot.width, height = plot.height, units="cm",useDingbats=FALSE) } diff --git a/R/consensusCluster.R b/R/consensusCluster.R index f4ecb50..4abe057 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -221,10 +221,15 @@ collect_subsample_cl_matrix <- function(norm.dat,result.files,all.cells,max.cl.s } cl= result$cl test.cells = setdiff(all.cells, names(cl)) - if(length(test.cells)>0){ - markers=unique(result$markers) - map.df = map_by_cor(norm.dat[markers,names(cl)],cl, norm.dat[markers,test.cells],method="mean")$pred.df - test.cl = setNames(map.df$pred.cl, row.names(map.df)) + if(length(test.cells) > 0){ + if(is.null(result$test.cl)){ + markers=unique(result$markers) + map.df = map_by_cor(norm.dat[markers,names(cl)],cl, norm.dat[markers,test.cells],method="mean")$pred.df + test.cl = setNames(map.df$pred.cl, row.names(map.df)) + } + else{ + test.cl = result$test.cl + } all.cl = c(setNames(as.character(cl),names(cl)), setNames(as.character(test.cl), names(test.cl))) } else{ @@ -513,6 +518,8 @@ run_consensus_clust <- function(norm.dat, all.cells= intersect(all.cells, names(init.result$cl)) } run <- function(i,...){ + require(foreach) + require(parallel) prefix = paste("iter",i,sep=".") print(prefix) outfile= file.path(output_dir, paste0("result.",i,".rda")) @@ -521,6 +528,7 @@ run_consensus_clust <- function(norm.dat, } select.cells=sample(all.cells, round(length(all.cells)*sample.frac)) save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) + result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) save(result, file=outfile) } @@ -529,12 +537,15 @@ run_consensus_clust <- function(norm.dat, sapply(1:niter, function(i){run(i,...)}) } else{ - require(foreach) + require(doParallel) - cl <- makeForkCluster(mc.cores) - registerDoParallel(cl) - foreach(i=1:niter, .combine='c') %dopar% run(i) - stopCluster(cl) + require(parallel) + require(foreach) + + cl <- parallel::makeCluster(mc.cores) + doParallel::registerDoParallel(cl) + foreach::foreach(i=1:niter, .combine='c') %dopar% { run(i) } + parallel::stopCluster(cl) } result.files=file.path(output_dir, dir(output_dir, "result.*.rda")) co.result <- collect_subsample_cl_matrix(norm.dat,result.files,all.cells) diff --git a/R/de.genes.R b/R/de.genes.R index d7bdd89..53146d7 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -473,6 +473,7 @@ simple_lmFit <- function(norm.dat, cl, cl.means = NULL, cl.sqr.means = NULL) } + simple_ebayes <- function(fit,proportion=0.01,stdev.coef.lim=c(0.1,4),trend=FALSE,robust=FALSE,winsor.tail.p=c(0.05,0.1)) # Empirical Bayes statistics to select differentially expressed genes # Gordon Smyth @@ -480,32 +481,32 @@ simple_ebayes <- function(fit,proportion=0.01,stdev.coef.lim=c(0.1,4),trend=FALS # Made a non-exported function 18 Feb 2018. { require(limma) - coefficients <- fit$coefficients - stdev.unscaled <- fit$stdev.unscaled - sigma <- fit$sigma - df.residual <- fit$df.residual - if(is.null(coefficients) || is.null(stdev.unscaled) || is.null(sigma) || is.null(df.residual)) stop("No data, or argument is not a valid lmFit object") - if(all(df.residual==0)) stop("No residual degrees of freedom in linear model fits") - if(all(!is.finite(sigma))) stop("No finite residual standard deviations") - if(trend) { - covariate <- fit$Amean - if(is.null(covariate)) stop("Need Amean component in fit to estimate trend") - } else { - covariate <- NULL - } - -# Moderated t-statistic - out <- squeezeVar(sigma^2, df.residual, covariate=covariate, robust=robust, winsor.tail.p=winsor.tail.p) - out$s2.prior <- out$var.prior - out$s2.post <- out$var.post - out$var.prior <- out$var.post <- NULL - out$t <- coefficients / stdev.unscaled / sqrt(out$s2.post) - df.total <- df.residual + out$df.prior - df.pooled <- sum(df.residual,na.rm=TRUE) - df.total <- pmin(df.total,df.pooled) - out$df.total <- df.total - out$p.value <- 2*pt(-abs(out$t),df=df.total) - return(out) + coefficients <- fit$coefficients + stdev.unscaled <- fit$stdev.unscaled + sigma <- fit$sigma + df.residual <- fit$df.residual + if(is.null(coefficients) || is.null(stdev.unscaled) || is.null(sigma) || is.null(df.residual)) stop("No data, or argument is not a valid lmFit object") + if(all(df.residual==0)) stop("No residual degrees of freedom in linear model fits") + if(all(!is.finite(sigma))) stop("No finite residual standard deviations") + if(trend) { + covariate <- fit$Amean + if(is.null(covariate)) stop("Need Amean component in fit to estimate trend") + } else { + covariate <- NULL + } + + # Moderated t-statistic + out <- squeezeVar(sigma^2, df.residual, covariate=covariate, robust=robust, winsor.tail.p=winsor.tail.p) + out$s2.prior <- out$var.prior + out$s2.post <- out$var.post + out$var.prior <- out$var.post <- NULL + out$t <- coefficients / stdev.unscaled / sqrt(out$s2.post) + df.total <- df.residual + out$df.prior + df.pooled <- sum(df.residual,na.rm=TRUE) + df.total <- pmin(df.total,df.pooled) + out$df.total <- df.total + out$p.value <- 2*pt(-abs(out$t),df=df.total) + return(out) } @@ -582,7 +583,7 @@ de_pair_fast_limma <- function(pair, method <- match.arg(method, choices = c("fast_limma", "limma","chisq", "t.test")) - + require(parallel) if(use.voom & is.null(counts)) { stop("The use.voom = TRUE parameter requires a raw count matrix via the counts parameter.") } @@ -666,8 +667,8 @@ de_pair_fast_limma <- function(pair, on.exit(parallel::stopCluster(Clu), add = TRUE) } - de_list = pvec(1:nrow(pairs), function(x){ - sapply(x, function(i){ + de_list = parallel::pvec(1:nrow(pairs), function(x){ + tmp=sapply(x, function(i){ if(method == "limma") { require("limma") df= de_pair_limma(pair = pairs[i,], @@ -715,9 +716,14 @@ de_pair_fast_limma <- function(pair, cl.size2, return.df = return.df) },simplify=F) + cat(length(tmp), length(x),"\n") + if(length(tmp)!=length(x)){ + save(x, file="Error.pairs.rda") + stop('length of de_list does not match pairs') + } + names(tmp) = row.names(pairs)[x] + tmp },mc.cores=mc.cores) - - names(de_list) <- paste(pairs[,1],pairs[,2],sep="_") return(de_list) } @@ -884,11 +890,13 @@ de_stats_pair <- function(df, #' @export #' de_all_pairs <- function(norm.dat, - cl, - de.param = de_param(), - method = "fast_limma", - de.genes = NULL, - ...) { + cl, + de.param = de_param(), + method = "fast_limma", + de.genes = NULL, + mc.cores=1, + ...) { + cn <- as.character(sort(unique(cl))) pairs= create_pairs(cn) @@ -903,6 +911,7 @@ de_all_pairs <- function(norm.dat, pairs = missing_pairs, de.param = de.param, method = method, + mc.cores=mc.cores, ...)) return(de.genes) diff --git a/R/dend.markers.R b/R/dend.markers.R index 05838f8..7b951dd 100644 --- a/R/dend.markers.R +++ b/R/dend.markers.R @@ -1,4 +1,5 @@ -#' Select node specific markers + + #' Select node specific markers #' #' @param dend #' @param norm.dat @@ -59,6 +60,7 @@ select_node_specific_markers <- function(dend, norm.dat, cl, n.markers=10,de.gen #' @examples select_dend_markers <- function(dend, cl, de.genes,norm.dat=NULL,up.gene.score=NULL, down.gene.score=NULL,...) { + library(matrixStats) require(dendextend) require(randomForest) print(dend) diff --git a/R/dendro.R b/R/dendro.R index cc63b75..cbf330b 100644 --- a/R/dendro.R +++ b/R/dendro.R @@ -70,13 +70,13 @@ build_dend <- function(cl.dat, cl.cor=NULL, l.rank=NULL, l.color=NULL, nboot=100 cl.hc = hclust(as.dist(1-cl.cor),method="average") dend = as.dendrogram(cl.hc) } - dend = dend %>% set("labels_cex", 0.7) + dend = dendextend::set(dend,"labels_cex", 0.7) if(!is.null(l.color)){ - dend = dend %>% set("labels_col", l.color[labels(dend)]) + dend = dendextend::set(dend, "labels_col", l.color[labels(dend)]) } - dend = dend %>% set("leaves_pch", 19) %>% set("leaves_cex", 0.5) + dend = dend %>% dendextend::set("leaves_pch", 19) %>% dendextend::set("leaves_cex", 0.5) if(!is.null(l.color)){ - dend = dend %>% set("leaves_col", l.color[labels(dend)]) + dend = dendextend::set(dend, "leaves_col", l.color[labels(dend)]) } if(!is.null(l.rank)){ dend =reorder_dend(dend,l.rank) diff --git a/R/find_noise_cl.R b/R/find_noise_cl.R index 809417b..5ada91d 100644 --- a/R/find_noise_cl.R +++ b/R/find_noise_cl.R @@ -285,6 +285,7 @@ plot_low_qc <- function(norm.dat, find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) { + require(parallel) if(is.null(de.genes)){ stop("Need to specify de.genes") } @@ -298,7 +299,7 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) doParallel::registerDoParallel(cores) on.exit(parallel::stopCluster(cores), add = TRUE) } - result.list= pvec(names(de.genes), function(pairs){ + result.list= parallel::pvec(names(de.genes), function(pairs){ result.list= sapply(pairs, function(p){ de = de.genes[[p]] if(length(de)==0){ @@ -311,11 +312,14 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) cl1 = tmp[[1]] cl2 = tmp[[2]] - up.genes = head(names(de$up.genes), 50) - down.genes = head(names(de$down.genes),50) - - up.genes.score = de$up.score - down.genes.score = de$down.score + up.genes.score = head(de$up.genes, 50) + down.genes.score = head(de$down.genes,50) + up.genes.score[up.genes.score > 20] = 20 + down.genes.score[down.genes.score > 20] = 20 + up.genes = names(up.genes.score) + down.genes = names(down.genes.score) + up.genes.score=sum(up.genes.score) + down.genes.score = sum(down.genes.score) results = sapply(setdiff(as.character(cl),c(cl1,cl2)), function(cl3){ tmp1.de = get_de_pair(de.genes, cl1, cl3) diff --git a/R/harmonize.R b/R/harmonize.R index 373503b..0c790a0 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -555,6 +555,19 @@ knn_jaccard_louvain <- function(knn.index) +knn_jaccard_leiden <- function(knn.index) + { + require(igraph) + require(leiden) + cat("Get jaccard\n") + sim=knn_jaccard(knn.index) + cat("leiden clustering\n") + result <- leiden(sim) + return(result) + } + + + #' Harmonize #' #' @param comb.dat @@ -864,15 +877,31 @@ get_gene_cl_correlation <- function(cl.means.list) simple_dend <- function(cl.means.list) { levels = unique(unlist(lapply(cl.means.list, colnames))) - n.counts = tmp.cor=matrix(0, nrow=length(levels), ncol=length(levels)) - row.names(n.counts) = row.names(tmp.cor)=levels - colnames(n.counts)=colnames(tmp.cor)=levels + n.counts = cl.cor=matrix(0, nrow=length(levels), ncol=length(levels)) + row.names(n.counts) = row.names(cl.cor)=levels + colnames(n.counts)=colnames(cl.cor)=levels for(x in cl.means.list){ - tmp.cor[colnames(x),colnames(x)] = cor(x) + tmp.cor= cor(x) + tmp.cor[is.na(tmp.cor)] = 0 + cl.cor[colnames(x),colnames(x)] = cl.cor[colnames(x),colnames(x)] + tmp.cor n.counts[colnames(x),colnames(x)] = n.counts[colnames(x),colnames(x)] +1 } - tmp.cor = tmp.cor/n.counts - hclust(as.dist(1-tmp.cor)) + cl.cor = cl.cor/n.counts + cl.cor[is.na(cl.cor)] = 0 + dend=as.dendrogram(hclust(as.dist(1-cl.cor))) + dend = dend %>% set("labels_cex", 0.7) + if (!is.null(l.color)) { + dend = dend %>% set("labels_col", l.color[labels(dend)]) + } + dend = dend %>% set("leaves_pch", 19) %>% set("leaves_cex", + 0.5) + if (!is.null(l.color)) { + dend = dend %>% set("leaves_col", l.color[labels(dend)]) + } + if (!is.null(l.rank)) { + dend = reorder_dend(dend, l.rank) + } + return(list(dend=dend, cl.cor=cl.cor)) } #' Impute val cor diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 201bc12..933fdf3 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -28,7 +28,7 @@ get_knn_weight <- function(knn.dist, scale=0.2, exclude.th = 0.0001) #' @export #' #' @examples -predict_knn <- function(knn.idx, reference, cl) +predict_knn_old <- function(knn.idx, reference, cl) { library(matrixStats) library(dplyr) @@ -56,7 +56,7 @@ predict_knn <- function(knn.idx, reference, cl) #' @export #' #' @examples -predict_knn_new <- function(knn.idx, reference, cl, ...) +predict_knn <- function(knn.idx, reference, cl, ...) { library(matrixStats) library(dplyr) @@ -83,30 +83,67 @@ predict_knn_new <- function(knn.idx, reference, cl, ...) #' @export #' #' @examples -impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w, ...) +impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores=1,transpose=FALSE,th=NULL,sparse=FALSE,batch.size=100000,combine=TRUE,...) { + require(doParallel) query = row.names(knn.idx) - impute.dat= matrix(0, nrow=nrow(knn.idx),ncol=ncol(dat)) if(is.null(w)){ if(!is.null(knn.dist)){ w = get_knn_weight(knn.dist,...) } - else{ - w = matrix(1, nrow=nrow(knn.idx),ncol=ncol(knn.idx)) + } + if (mc.cores == 1) { + registerDoSEQ() + } + else { + Clu <- makeForkCluster(mc.cores) + doParallel::registerDoParallel(Clu) + on.exit(parallel::stopCluster(Clu), add = TRUE) + } + k = 1:nrow(knn.idx) + bins = split(k, floor(k/batch.size)) + impute.dat = foreach(j=1:length(bins),.combine="c") %dopar% { + x = bins[[j]] + impute.dat <- matrix(0, nrow=length(x),ncol=ncol(dat)) + total.w <- rep(0, length(x)) + for(i in 1:ncol(knn.idx)){ + cat("bin", x[1],i, "\n") + nn = reference[knn.idx[x,i]] + select = nn %in% row.names(dat) + tmp.dat = dat[nn[select],] +###Ignore the neighbors not present in imputation reference + if(!is.null(w)){ + impute.dat[select,] <<- impute.dat[select,] + tmp.dat* w[select, i] + total.w[select] = total.w[select]+ w[select,i] + } + else{ + impute.dat[select,]= impute.dat[select,] + tmp.dat + total.w[select] = total.w[select]+ 1 + } + rm(tmp.dat) + gc() + } + impute.dat = impute.dat / total.w + row.names(impute.dat) = row.names(knn.idx)[x] + colnames(impute.dat) = colnames(dat) + if(!is.null(th)){ + impute.dat[impute.dat < th] = 0 + } + if(transpose){ + impute.dat = t(impute.dat) } + if(sparse){ + impute.dat = Matrix(impute.dat, sparse=T) + } + return(list(impute.dat)) } - total.w = rep(0, nrow(knn.idx)) - for(i in 1:ncol(knn.idx)){ - print(i) - nn = reference[knn.idx[,i]] - ###Ignore the neighbors not present in imputation reference - select = nn %in% row.names(dat) - impute.dat[select,]= impute.dat[select,] + dat[nn[select],] * w[select, i] - total.w[select] = total.w[select]+ w[select,i] + if(combine){ + method="rbind" + if(transpose){ + method="cbind" + } + impute.dat = do.call(method, impute.dat) } - impute.dat = impute.dat / total.w - row.names(impute.dat) = row.names(knn.idx) - colnames(impute.dat) = colnames(dat) return(impute.dat) } @@ -166,8 +203,9 @@ iter_impute_knn <- function(knn, ref, dat, tol=10^-3,max.iter=100,...) #' @export #' #' @examples -impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=80, th=0.5, rm.eigen=NULL,rm.th=0.65) +impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) { + library(matrixStats) org.rd.dat.list <- list() knn.list <- list() impute.dat.list <- list() @@ -176,19 +214,28 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell { print(x) tmp.cells= select.cells[comb.dat$meta.df[select.cells,"platform"]==x] - ref.cells = intersect(ref.list[[x]],tmp.cells) - rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th) + ref.cells = ref.list[[x]] + rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th, method=method,mc.cores=mc.cores,verbose=verbose) + org.rd.dat.list[[x]] = rd.result + rd.result = org.rd.dat.list[[x]] if(!is.null(rm.eigen)){ - rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th) + rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th,verbose=verbose) } print(ncol(rd.dat)) - knn.result <- RANN::nn2(data=rd.dat[ref.cells,], query=rd.dat, k=15) - knn <- knn.result[[1]] - row.names(knn) = row.names(rd.dat) - org.rd.dat.list[[x]] = rd.result - knn.list[[x]]=knn - knn = knn.list[[x]] - impute.dat.list[[x]] <- impute_knn(knn, ref.cells, t(as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells]))) + knn.result = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k) + row.names(knn.result[[1]]) = row.names(rd.dat) + knn.list[[x]]=knn.result + knn = knn.list[[x]][[1]] + impute.dat = matrix(0, ncol=length(select.cells),nrow=length(select.genes)) + row.names(impute.dat)=select.genes + colnames(impute.dat) = select.cells + impute.result <- impute_knn(knn, ref.cells, t(as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells])),mc.cores=mc.cores, sparse=TRUE, transpose=TRUE,combine=FALSE) + for(i in 1:length(impute.result)){ + print(i) + dat = impute.result[[i]] + impute.dat[,colnames(dat)] <- as.matrix(dat) + } + impute.dat.list[[x]] = impute.dat } ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. for(x in names(split.results)){ @@ -196,7 +243,7 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell result = split.results[[x]] cl = result$cl knn = result$knn - for(ref.set in names(result$ref.list)){ + for(ref.set in intersect(names(result$ref.list),names(ref.list))){ print(ref.set) tmp.cells = row.names(knn) add.cells=FALSE @@ -213,23 +260,41 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell if(sum(select.cols)==0){ next } - else{ - ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) - select.knn = knn[query.cells,select.cols] - impute.dat = impute_knn(select.knn, comb.dat$all.cells, impute.dat.list[[ref.set]][ref.cells,impute.genes]) + ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) + select.knn = knn[query.cells,select.cols] + dat = t(impute.dat.list[[ref.set]][impute.genes,ref.cells]) + impute.result = impute_knn(select.knn, comb.dat$all.cells, dat=dat, transpose=TRUE, mc.cores=mc.cores,combine=FALSE) + for(i in 1:length(impute.result)){ + impute.dat = impute.result[[i]] + impute.dat.list[[ref.set]][impute.genes,colnames(impute.dat)] <- impute.dat + rm(impute.dat) + gc() } - if(!add.cells){ - impute.dat.list[[ref.set]][query.cells, impute.genes] <- impute.dat - } - else{ - impute.dat.list[[ref.set]] <- rbind(impute.dat.list[[ref.set]],impute.dat) - } - print("Impute dimension") - print(dim(impute.dat.list[[ref.set]])) - rm(impute.dat) - gc() } } return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) } + + + +fast_knn <- function(query.dat, ref.dat=query.dat, distance="euclidean", k=15, M=16, ef=200,method="euclidean") + { + library("RcppHNSW") + if(method=="euclidean"){ + p = new(HnswL2,ncol(ref.dat), nrow(ref.dat),M, ef) + } + else if(method=="cosine"){ + p = new(HnswCosine,ncol(ref.dat), nrow(ref.dat),M, ef) + } + else if(method=="ip"){ + p = new(HnswIP,ncol(ref.dat), nrow(ref.dat),M, ef) + } + p$addItems(ref.dat) + knn.result = p$getAllNNsList(query.dat, k=15, include_distance=TRUE) + row.names(knn.result[[1]]) = row.names(knn.result[[2]]) = row.names(query.dat) + return(knn.result) + } + + + diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 809b221..01b1bca 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -170,6 +170,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl = setNames(as.character(cl),names(cl)) merge_x_y <- function(x, y) { + cat("merge", x, y, "\n") cl[cl==x]= y if(length(unique(cl))==1){ return(NULL) @@ -190,12 +191,14 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } include.y = length(tmp.cells2) >= merge.de.param.list[[set]]$min.cells if(!is.null(cl.means.list)){ - tmp = colnames(cl.means.list[[set]])!=x - cl.means.list[[set]] = cl.means.list[[set]][,tmp,drop=F] + if(!is.null(cl.means.list[[set]])){ + tmp = colnames(cl.means.list[[set]])!=x + cl.means.list[[set]] = cl.means.list[[set]][,tmp,drop=F] + } tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]) if(include.y){ - if(!is.null(cl.means.list[[set]]) & nrow(cl.means.list[[set]])>0){ - cl.means.list[[set]][[y]] = tmp.means[row.names(cl.means.list[[set]])] + if(!is.null(cl.means.list[[set]])){ + cl.means.list[[set]][[y]] = tmp.means } else{ cl.means.list[[set]] = data.frame(tmp.means) @@ -204,12 +207,14 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } if(!is.null(cl.sqr.means.list) & !is.null(cl.sqr.means.list[[set]]) & de.method=="fast_limma"){ - tmp = colnames(cl.sqr.means.list[[set]])!=x - cl.sqr.means.list[[set]] = cl.sqr.means.list[[set]][,tmp,drop=F] + if(!is.null(cl.sqr.means.list[[set]])){ + tmp = colnames(cl.sqr.means.list[[set]])!=x + cl.sqr.means.list[[set]] = cl.sqr.means.list[[set]][,tmp,drop=F] + } tmp.sqr.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]^2) if(include.y){ - if(!is.null(cl.sqr.means.list[[set]]) & nrow(cl.sqr.means.list[[set]])>0){ - cl.sqr.means.list[[set]][[y]] = tmp.sqr.means[row.names(cl.sqr.means.list[[set]])] + if(!is.null(cl.sqr.means.list[[set]])){ + cl.sqr.means.list[[set]][[y]] = tmp.sqr.means } else{ cl.sqr.means.list[[set]] = data.frame(tmp.means) @@ -217,13 +222,15 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } - if(!is.null(cl.present.list) & !is.null(cl.present.list[[set]])){ - tmp = colnames(cl.present.list[[set]])!=x - cl.present.list[[set]] = cl.present.list[[set]][,tmp,drop=F] + if(!is.null(cl.present.list) & !is.null(cl.present.list[[set]])){ + if(!is.null(cl.present.list[[set]])){ + tmp = colnames(cl.present.list[[set]])!=x + cl.present.list[[set]] = cl.present.list[[set]][,tmp,drop=F] + } tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F] >= merge.de.param.list[[set]]$low.th) if(include.y){ - if(!is.null(cl.present.list[[set]])&nrow(cl.present.list[[set]])>0){ - cl.present.list[[set]][[y]] = tmp.means[row.names(cl.present.list[[set]])] + if(!is.null(cl.present.list[[set]])){ + cl.present.list[[set]][[y]] = tmp.means } else{ cl.present.list[[set]] = data.frame(tmp.means) diff --git a/R/harmonize_util.R b/R/harmonize_util.R index e7aeeb6..9a2cd7b 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -332,23 +332,23 @@ get_de_lfc_list <- function(cl.means.list) #' @export #' #' @examples -get_de_result <- function(dat.list, de.param.list, cl, select.sets=names(de.param.list), ...) +get_de_result <- function(dat.list, de.param.list, cl, select.sets=names(de.param.list), max.cl.size=200,...) { - de.result <- sapply(select.sets, function(x){ + de.genes.list <- sapply(select.sets, function(x){ tmp.cl =cl[names(cl) %in% colnames(dat.list[[x]])] if(is.factor(tmp.cl)){ tmp.cl = droplevels(tmp.cl) } + tmp.cells = sample_cells(tmp.cl, max.cl.size) + tmp.cl = tmp.cl[tmp.cells] + if(length(unique(tmp.cl)) > 1){ - de.result = display_cl(tmp.cl, dat.list[[x]], max.cl.size = 200, de.param= de.param.list[[x]],...) + de.result = de_all_pairs(norm.dat= dat.list[[x]], cl=tmp.cl, de.param= de.param.list[[x]],...) } else{ return(NULL) } },simplify=F) - marker.counts <- table(unlist(sapply(de.result,function(x)x$markers,simplify=F))) - de.genes.list = sapply(de.result, function(x)x$de.genes, simplify=F) - return(list(marker.counts=marker.counts, de.genes.list=de.genes.list)) } #' Title diff --git a/R/markers.R b/R/markers.R index 4c8a6ae..ef7887b 100644 --- a/R/markers.R +++ b/R/markers.R @@ -12,10 +12,11 @@ #' @examples -select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1,...) +select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1,bin.lfc.th=NULL,...) { + require(parallel) if(is.null(de.genes)){ - de.genes=de_all_pairs(norm.dat, cl, ...) + de.genes=de_all_pairs(norm.dat, cl, mc.cores=mc.cores,...) } pairs.df = get_pairs(names(de.genes)) select.pairs = row.names(pairs.df)[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] @@ -28,10 +29,17 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1, on.exit(parallel::stopCluster(Clu), add = TRUE) } - de.markers = pvec(select.pairs, function(s){ + de.markers = parallel::pvec(select.pairs, function(s){ sapply(s, function(x){ tmp = de.genes[[x]] - c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) + select.genes = c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) + ###Choose binary genes even if not the top genes + if(!is.null(bin.lfc.th)){ + de.df = tmp$de.df + bin.genes = tmp$genes[abs(de.df[tmp$genes, "lfc"]) > bin.lfc.th] + select.genes = union(select.genes, bin.genes) + } + select.genes },simplify=F) },mc.cores=mc.cores) markers = intersect(unlist(de.markers),row.names(norm.dat)) @@ -53,6 +61,7 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max { require(Matrix) require(doParallel) + require(parallel) if (mc.cores == 1) { registerDoSEQ() } @@ -63,7 +72,7 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max } if(is.null(all.genes)){ - all.genes <- pvec(names(de.genes), function(p){ + all.genes <- parallel::pvec(names(de.genes), function(p){ de = de.genes[[p]] pair = strsplit(p, "_")[[1]] x = pair[[1]] @@ -81,7 +90,7 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max },mc.cores=mc.cores) all.genes=unique(unlist(all.genes)) } - up.gene.score = pvec(names(de.genes),function(x){ + up.gene.score = parallel::pvec(names(de.genes),function(x){ mat=sapply(x, function(p){ de = de.genes[[p]] tmp= match(all.genes, head(names(de$up.genes),max.num)) @@ -97,7 +106,7 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max up.gene.score = do.call("cbind",up.gene.score) } - down.gene.score = pvec(names(de.genes),function(x){ + down.gene.score = parallel::pvec(names(de.genes),function(x){ mat=sapply(x, function(p){ de = de.genes[[p]] tmp= match(all.genes, head(names(de$down.genes),max.num)) @@ -249,6 +258,7 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up #' @examples select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) { + require(matrixStats) pairs = do.call("rbind",strsplit(names(de.genes), "_")) pairs = gsub("cl", "",pairs) row.names(pairs)= names(de.genes) @@ -264,8 +274,8 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max. tmp.up.gene.score = cbind(up.gene.score[,up.pairs,drop=F], down.gene.score[,down.pairs,drop=F]) tmp.down.gene.score = cbind(down.gene.score[,up.pairs,drop=F], up.gene.score[,down.pairs,drop=F]) - up.genes = row.names(tmp.up.gene.score)[head(order(rowSums(tmp.up.gene.score, decreasing=T)), n.markers)] - down.genes = row.names(tmp.down.gene.score)[head(order(rowSums(tmp.down.gene.score,dereasing=T)), n.markers)] + up.genes = row.names(tmp.up.gene.score)[head(order(rowSums(tmp.up.gene.score), decreasing=T), n.markers)] + down.genes = row.names(tmp.down.gene.score)[head(order(rowSums(tmp.down.gene.score), decreasing=T), n.markers)] up.num = colSums(tmp.up.gene.score[up.genes,,drop=F] >0) down.num = colSums(tmp.down.gene.score[down.genes,,drop=F] >0 ) @@ -273,8 +283,8 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max. add.genes = setNames(rep(n.markers, ncol(tmp.up.gene.score)), colnames(tmp.up.gene.score)) - total.num add.genes = add.genes[add.genes > 0] - up.genes = up.genes[rowMins(tmp.up.gene.score[up.genes,,drop=F]) > 0 ] - down.genes = down.genes[rowMins(tmp.down.gene.score[down.genes,,drop=F]) > 0 ] + up.genes = up.genes[rowMins(as.matrix(tmp.up.gene.score[up.genes,,drop=F])) > 0 ] + down.genes = down.genes[rowMins(as.matrix(tmp.down.gene.score[down.genes,,drop=F])) > 0 ] genes = union(up.genes, down.genes) if(length(add.genes)>0){ tmp=select_markers_pair(add.genes= add.genes,de.genes= de.genes, gene.score=pmin(tmp.up.gene.score, tmp.down.gene.score), rm.genes=c(up.genes, down.genes),top.n=top.n) @@ -367,7 +377,7 @@ select_pos_markers <- function(de.genes, cl, cl.means=NULL, n.markers=3, default } ###for each cluster, find markers that discriminate it from other types - cl.markers <- pvec(levels(cl), function(x){ + cl.markers <- parallel::pvec(levels(cl), function(x){ sapply(x, function(tmp.cl){ cat("Cl\n",tmp.cl,"\n") up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] @@ -406,7 +416,7 @@ select_top_pos_markers <- function(de.genes, cl, n.markers=3, up.gene.score, dow } ###for each cluster, find markers that discriminate it from other types - cl.markers <- pvec(levels(cl), function(x){ + cl.markers <- parallel::pvec(levels(cl), function(x){ sapply(x, function(tmp.cl){ print(tmp.cl) up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 39c7b5d..ac61970 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -38,7 +38,7 @@ prcomp.irlba <- function(x, max.rank=500, maxit=1000, tol=1e-05, center=TRUE,... #' @export #' #' @examples -rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2, verbose=FALSE, method="zscore") +rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=colnames(norm.dat),sampled.cells=select.cells, max.pca=10, th=2, verbose=FALSE, method="zscore", mc.cores=1) { library(Matrix) library(stats) @@ -54,8 +54,14 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln if(verbose){ print("Project") } - tmp.dat = norm.dat[row.names(rot), select.cells,drop=F] - rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) + require(parallel) + rd.dat = parallel::pvec(select.cells, function(x){ + print(length(x)) + tmp.dat = norm.dat[row.names(rot), x,drop=F] + rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) + return(list(rd.dat)) + }, mc.cores=mc.cores) + rd.dat = do.call("rbind",rd.dat) } return(list(rd.dat=rd.dat, pca=pca)) } diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 36a9c9f..50f4b66 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -39,23 +39,33 @@ get_RD_cl_center <- function(rd.dat, cl) #' @export #' #' @examples -plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alpha.val=1,show.legend=FALSE, legend.size=2, label.center=TRUE, bg="blank",fn.color="black") +plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alpha.val=NULL,show.legend=FALSE, legend.size=2, label.center=TRUE, bg="blank",fn.color="black",no.shape=TRUE,ncol=4) { rd.dat=as.data.frame(rd.dat) colnames(rd.dat) = paste0("Dim", 1:ncol(rd.dat)) - rd.dat$cl = cl[row.names(rd.dat)] - rd.dat$cl_label = droplevels(factor(cl.label[as.character(rd.dat$cl)], levels=cl.label)) + rd.dat$cl = factor(cl[row.names(rd.dat)]) if(label.center){ cl.center = get_RD_cl_center(rd.dat, cl) - row.names(cl.center) = cl.label[row.names(cl.center)] } - shape = setNames(1:length(levels(rd.dat$cl_label)) %% 20 + 1,levels(rd.dat$cl_label)) - g=ggplot(rd.dat, aes(Dim1, Dim2)) + geom_point(aes(color=cl_label,shape=cl_label),size=cex) - g = g+ scale_color_manual(values=alpha(as.vector(cl.color[levels(rd.dat$cl_label)]),alpha.val))+ scale_shape_manual(values=as.vector(shape[levels(rd.dat$cl_label)])) + if(!no.shape){ + shape = setNames(1:length(levels(rd.dat$cl)) %% 20 + 1,levels(rd.dat$cl)) + g=ggplot(rd.dat, aes(Dim1, Dim2)) + geom_point(aes(color=cl,shape=cl),size=cex) + g = g+ scale_shape_manual(values=as.vector(shape[levels(rd.dat$cl)])) + } + else{ + g=ggplot(rd.dat, aes(Dim1, Dim2)) + geom_point(aes(color=cl),size=cex) + } + if(!is.null(alpha.val)){ + col = alpha(as.vector(cl.color[levels(rd.dat$cl)]),alpha.val) + } + else{ + col = as.vector(cl.color[levels(rd.dat$cl)]) + } + g = g+ scale_color_manual(values=col,labels=cl.label[levels(rd.dat$cl)]) if(label.center){ g = g + geom_point(data=as.data.frame(cl.center), aes(x=x, y=y), size=cex*1.5) for(i in 1:nrow(cl.center)){ - g = g + annotate("text", label=row.names(cl.center)[i], x=cl.center[i,1], y=cl.center[i,2],size=fn.size,color=fn.color) + g = g + annotate("text", label=cl.label[row.names(cl.center)[i]], x=cl.center[i,1], y=cl.center[i,2],size=fn.size,color=fn.color) } } if(bg=="blank"){ @@ -67,8 +77,12 @@ plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alph g = g + theme(panel.background= element_rect(fill=bg, color=NA), panel.border = element_blank(),panel.grid.major = element_blank(), panel.grid.minor= element_blank()) } if(show.legend){ - g = g + guides(colour = guide_legend(override.aes = list(shape = shape[levels(rd.dat$cl_label)])),ncol=5) - g <- g + guides(color = guide_legend(override.aes = list(size = legend.size))) + if(no.shape){ + g = g + guides(colour = guide_legend(override.aes = list(size = legend.size),ncol=ncol)) + } + else{ + g = g + guides(colour = guide_legend(override.aes = list(shape = shape[levels(rd.dat$cl)],size = legend.size)),ncol=ncol) + } g = g + theme(legend.position="bottom") } else{ @@ -445,3 +459,70 @@ plot_3d_select <- function(rd.dat, select.cells, fg.col= "red", bg.col="gray", } } + +plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missing.color="gray85",min.size=10,fg.alpha=1,bg.alpha=0.5,...) + { + cl= setNames(as.character(cl), names(cl)) + cl = cl[names(cl)%in% select.samples] + tmp = setdiff(row.names(rd.dat),names(cl)) + cl = c(cl, setNames(rep("0",length(tmp)), tmp)) + cl.size= table(cl) + cl.small = names(cl.size)[cl.size < min.size] + cl.label[c(cl.small,"0")] = " " + cl.color["0"] = missing.color + alpha.val = setNames(rep(fg.alpha, length(cl.color)),names(cl.color)) + alpha.val["0"] = bg.alpha + cl.color = alpha(cl.color, alpha.val) + plot_RD_cl(rd.dat, cl, cl.color, cl.label,...) + } + + + + +plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./",meta.fields=c("platform","joint_region")) + { + library(data.table) + library(dplyr) + library(ggplot2) + umap.df <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) + colnames(umap.df) = c("sample_name","Dim1","Dim2") + umap.df = umap.df[sample(1:nrow(umap.df)),] + umap.df = umap.df %>% left_join(anno.df) + umap.2d = umap.df[,c("Dim1","Dim2")] + row.names(umap.2d)=umap.df$sample_name + cl = setNames(umap.df$cl, umap.df$sample_name) + cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique + cl.color = setNames(cl.df$cluster_color, cl.df$cl) + cl.label = setNames(cl.df$cl, cl.df$cl) + g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=0.5) + ggsave(g, file=file.path(dest.d, gsub(".csv",".pdf",umap.fn))) + ggsave(g, file=file.path(dest.d, gsub(".csv",".png",umap.fn))) + + for(m in meta.fields){ + tmp.df = umap.df[,paste0(m, c("_id","_label","_color"))] %>% unique + colnames(tmp.df)=c("id","label","color") + tmp.df = tmp.df %>% arrange(id) + tmp.color = setNames(as.character(tmp.df$color), tmp.df$label) + g= plot_RD_meta(umap.2d, factor(umap.df[,paste0(m, "_label")], levels=names(tmp.color)),meta.col = tmp.color,alpha=0.5) + ggsave(g, file=file.path(dest.d, gsub("csv",paste0(m,".pdf"),umap.fn)),height=7,width=8.5) + ggsave(g, file=file.path(dest.d, gsub("csv",paste0(m,".png"),umap.fn)),height=7,width=8.5) + } + return(umap.2d) + } + + + + + +#dest.d = "Manuscript/common/umap_constellation/" +#for(umap.fn in dir(dest.d, pattern="umap.2d.sampled.csv")){ +# plot_2d_umap(umap.fn, dest.d) +#} +plot_3d_umap_anno <- function(umap.fn, dest.d, anno.df, cols= c("region_color","cluster_color"), label_cols=list(NULL, "cluster_label"), win.dim=c(20,40,1500, 800), cex=0.7, html.fn = NULL) + { + umap.3d <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) + colnames(umap.3d) = c("sample_name", paste0("Dim", 1:(ncol(umap.3d)-1))) + umap.3d <- umap.3d %>% left_join(anno.df) + plot_3d_label_multiple(umap.3d, cols=cols, label_cols=label_cols, cex=cex, win.dim=win.dim, fn = html.fn, dir=dest.d) + } + From e360802b5bfa14c835c1009e26cb6a724135a8af Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Sat, 29 Aug 2020 08:21:10 -0700 Subject: [PATCH 17/70] fix typo --- R/de.genes.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/de.genes.R b/R/de.genes.R index 53146d7..01eca06 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -444,7 +444,7 @@ get_cl_sigma <- function(mat,cl, cl.means=NULL, cl.sqr.means = NULL) cl.means = get_cl_means(mat,cl) } if(is.null(cl.sqr.means)){ - cl.sqr.means = get_cl_sqr_means(mat,cl, cl.means=cl.means) + cl.sqr.means = get_cl_sqr_means(mat,cl) } df = sum(cl.size) - length(cl.size) sigma = sqrt(colSums( t(cl.sqr.means - cl.means^2) * cl.size[colnames(cl.sqr.means)]) / df) From 1de29fd4b4c80ba3db981b38a986e5d50ff9c0e4 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 30 Sep 2020 08:53:35 -0700 Subject: [PATCH 18/70] Add plotting function and more parallel processing --- R/KNN.graph.R | 4 +-- R/annotate.R | 63 ++++++++++++++++++++++++++++++++-------- R/dendro.R | 4 +-- R/harmonize.R | 9 +++--- R/harmonize_impute.R | 17 +++++++---- R/markers.R | 32 ++++++++++---------- R/reduceDimension_plot.R | 15 ++++++---- 7 files changed, 97 insertions(+), 47 deletions(-) diff --git a/R/KNN.graph.R b/R/KNN.graph.R index b115d9a..d54c9f5 100644 --- a/R/KNN.graph.R +++ b/R/KNN.graph.R @@ -12,8 +12,6 @@ #' @examples get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0.5,clean.cells=row.names(rd.dat)) { - ##fast_knn does not always work for small clusters - #knn.result = fast_knn(rd.dat,k=k, ef=ef,M=M) knn.result = RANN::nn2(rd.dat,k=k) row.names(knn.result[[1]]) = row.names(knn.result[[2]])=row.names(rd.dat) knn = knn.result[[1]] @@ -54,7 +52,7 @@ get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0. knn.cl.df$odds[i] = (q + 1) / (k /total * m) } knn.cl.df$frac = knn.cl.df$Freq/knn.cl.df$cl.from.total - return(list(knn.result=knn.result, pred.result=pred.result, knn.cl.df=knn.cl.df,outlier=outlier)) + return(list(knn.result=knn.result, knn.cl.df=knn.cl.df,outlier=outlier)) } diff --git a/R/annotate.R b/R/annotate.R index 9965b2e..1a399a3 100644 --- a/R/annotate.R +++ b/R/annotate.R @@ -234,32 +234,47 @@ map_sampling <- function(train.dat, markers, markers.perc = 0.8, iter = 100, - method = "median", - verbose = TRUE) { + method = "means", + verbose = TRUE, + mc.cores=1) { method <- match.arg(arg = method, choices = c("mean", "median")) - + + if(method =="mean"){ + train.cl.dat = get_cl_means(train.dat, train.cl) + } + else{ + train.cl.dat = get_cl_medians(train.dat, train.cl) + } + library(parallel) # Perform mapping iter times. - map.result <- sapply(1:iter, + map.result <- mclapply(1:iter, function(i){ if(verbose) { cat("\r", paste0("Running iteration ",i," of ",iter,". ")) flush.console() } tmp.markers <- sample(markers, round(length(markers) * markers.perc)) - map_by_cor(train.dat[tmp.markers,], - train.cl, - test.dat[tmp.markers,], - method = method) - }, simplify = F) + test.cl.cor <- cor(as.matrix(test.dat[tmp.markers,]), train.cl.dat[tmp.markers,]) + test.cl.cor[is.na(test.cl.cor)] <- 0 + max.cl.cor <- apply(test.cl.cor, 1, which.max) + pred.cl <- colnames(test.cl.cor)[max.cl.cor] + pred.cl <- setNames(pred.cl, row.names(test.cl.cor)) + pred.score <- apply(test.cl.cor, 1, max) + if (is.factor(train.cl)) { + pred.cl <- setNames(factor(pred.cl, levels = levels(train.cl)), + names(pred.cl)) + } + pred.df <- data.frame(pred.cl = pred.cl, pred.score = pred.score) + }, mc.cores=mc.cores) # Extract predicted cluster assignments from each iteration map.cl <- sapply(map.result, function(x) { - x$pred.df$pred.cl - } - ) + x$pred.cl + }) + # Compute fraction of times each sample mapped to each cluster row.names(map.cl) <- colnames(test.dat) map <- as.data.frame(as.table(as.matrix(map.cl))) @@ -608,3 +623,27 @@ match_cl <- function(cl, cl.df = cl.df, cor = mat)) } + + +clean_group_id <- function(cl.df, col="subclass") + { + col_label = paste0(col, "_label") + col_id = paste0(col, "_id") + + tmp = cl.df[[col_label]] + tmp1 = tmp[!duplicated(tmp)] + tmp = factor(tmp, levels=tmp1) + cl.df[[col_id]] = as.integer(tmp) + return(cl.df) + } + +clean_group_color <- function(cl.df, col="subclass") + { + col_id = paste0(col, "_id") + col_color = paste0(col, "_color") + tb = table(cl.df[[col_id]], cl.df[[col_color]]) + group_color = setNames(colnames(tb)[apply(tb, 1, which.max)], row.names(tb)) + cl.df[[col_color]] = group_color[as.character(cl.df[[col_id]])] + return(cl.df) + } + diff --git a/R/dendro.R b/R/dendro.R index cbf330b..017f699 100644 --- a/R/dendro.R +++ b/R/dendro.R @@ -106,9 +106,9 @@ unbranch_by_conf <- function(dend, conf.th) conf[i] = attr(dend[[i]],"edgePar")$conf } dend[[i]]=unbranch_by_conf(dend[[i]],conf.th) - } + } select = conf < conf.th - select.children = which(select ) + select.children = which(select ) if(length(select.children)>0){ unchanged = which(!select) new_dend = dend[unchanged] diff --git a/R/harmonize.R b/R/harmonize.R index 0c790a0..c8390e3 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -433,10 +433,11 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= result$knn = knn.comb cl = setNames(result$cl.mat[,1], row.names(result$cl.mat)) if(length(cl) < nrow(result$knn)){ - pred.df = predict_knn(result$knn, all.cells, cl)$pred.df - pred.cl= setNames(pred.df$pred.cl, row.names(pred.df)) - #cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) - cl = pred.cl + diff.cells = setdiff(row.names(result$knn), names(cl)) + pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl, mc.cores=ncores )$pred.df + pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) + cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) + } cl.platform.counts = table(meta.df[names(cl), "platform"],cl) print(cl.platform.counts) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 933fdf3..90c3f07 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -28,7 +28,7 @@ get_knn_weight <- function(knn.dist, scale=0.2, exclude.th = 0.0001) #' @export #' #' @examples -predict_knn_old <- function(knn.idx, reference, cl) +predict_knn_small <- function(knn.idx, reference, cl) { library(matrixStats) library(dplyr) @@ -92,6 +92,9 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores= w = get_knn_weight(knn.dist,...) } } + if(nrow(knn.idx) < batch.size){ + mc.cores=1 + } if (mc.cores == 1) { registerDoSEQ() } @@ -107,7 +110,7 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores= impute.dat <- matrix(0, nrow=length(x),ncol=ncol(dat)) total.w <- rep(0, length(x)) for(i in 1:ncol(knn.idx)){ - cat("bin", x[1],i, "\n") + #cat("bin", x[1],i, "\n") nn = reference[knn.idx[x,i]] select = nn %in% row.names(dat) tmp.dat = dat[nn[select],] @@ -237,7 +240,8 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell } impute.dat.list[[x]] = impute.dat } - ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. + + impute.genes=NULL for(x in names(split.results)){ print(x) result = split.results[[x]] @@ -248,15 +252,14 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell tmp.cells = row.names(knn) add.cells=FALSE query.cells = intersect(tmp.cells[comb.dat$meta.df[tmp.cells,"platform"] != ref.set], select.cells) - if(any(!query.cells %in% row.names(impute.dat.list[[ref.set]]))){ - add.cells=TRUE + if(is.null(impute.genes)){ impute.genes = select.genes } else{ impute.genes=intersect(select.genes,c(result$markers, result$select.genes)) } select.cols = comb.dat$meta.df[comb.dat$all.cells[knn[1,]],"platform"] == ref.set - print(select.cols) + cat("Impute genes", length(impute.genes),"\n") if(sum(select.cols)==0){ next } @@ -272,6 +275,8 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell } } } + + ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) } diff --git a/R/markers.R b/R/markers.R index ef7887b..4de78b1 100644 --- a/R/markers.R +++ b/R/markers.R @@ -72,21 +72,23 @@ get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max } if(is.null(all.genes)){ - all.genes <- parallel::pvec(names(de.genes), function(p){ - de = de.genes[[p]] - pair = strsplit(p, "_")[[1]] - x = pair[[1]] - y = pair[[2]] - lfc = cl.means[,x] - cl.means[,y] - up.genes = names(de$up.genes) - down.genes = names(de$down.genes) - #Deal with pairs with too many DEX genes, include all binary markers - up.binary.genes = up.genes[lfc[up.genes] > bin.th] - up.genes=up.genes[up.genes %in% c(head(up.genes, top.n), up.binary.genes)] - - down.binary.genes = down.genes[lfc[down.genes] < -bin.th] - down.genes=down.genes[down.genes %in% c(head(down.genes, top.n), down.binary.genes)] - list(up=up.genes, down=down.genes) + all.genes <- parallel::pvec(names(de.genes), function(x){ + genes=lapply(x, function(p){ + de = de.genes[[p]] + pair = strsplit(p, "_")[[1]] + x = pair[[1]] + y = pair[[2]] + lfc = cl.means[,x] - cl.means[,y] + up.genes = names(de$up.genes) + down.genes = names(de$down.genes) + #Deal with pairs with too many DEX genes, include all binary markers + up.binary.genes = up.genes[lfc[up.genes] > bin.th] + up.genes=up.genes[up.genes %in% c(head(up.genes, top.n), up.binary.genes)] + + down.binary.genes = down.genes[lfc[down.genes] < -bin.th] + down.genes=down.genes[down.genes %in% c(head(down.genes, top.n), down.binary.genes)] + list(up=up.genes, down=down.genes) + }) },mc.cores=mc.cores) all.genes=unique(unlist(all.genes)) } diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 50f4b66..abc1493 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -473,31 +473,36 @@ plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missin alpha.val = setNames(rep(fg.alpha, length(cl.color)),names(cl.color)) alpha.val["0"] = bg.alpha cl.color = alpha(cl.color, alpha.val) + rd.rd = rd.dat[order(row.names(rd.dat) %in% select.samples),] plot_RD_cl(rd.dat, cl, cl.color, cl.label,...) } -plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./",meta.fields=c("platform","joint_region")) +plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./",meta.fields=c("platform","joint_region"),alpha=0.5) { library(data.table) library(dplyr) library(ggplot2) - umap.df <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) + umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) colnames(umap.df) = c("sample_name","Dim1","Dim2") umap.df = umap.df[sample(1:nrow(umap.df)),] umap.df = umap.df %>% left_join(anno.df) umap.2d = umap.df[,c("Dim1","Dim2")] row.names(umap.2d)=umap.df$sample_name + umap.2d = umap.2d[sample(1:nrow(umap.2d)),] + umap.fn = basename(umap.fn) cl = setNames(umap.df$cl, umap.df$sample_name) cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique cl.color = setNames(cl.df$cluster_color, cl.df$cl) - cl.label = setNames(cl.df$cl, cl.df$cl) - g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=0.5) + cl.label = setNames(cl.df$cluster_label, cl.df$cl) + g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=alpha) ggsave(g, file=file.path(dest.d, gsub(".csv",".pdf",umap.fn))) ggsave(g, file=file.path(dest.d, gsub(".csv",".png",umap.fn))) - + g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=alpha,label.center=FALSE) + ggsave(g, file=file.path(dest.d, gsub(".csv",".no.label.png",umap.fn))) + for(m in meta.fields){ tmp.df = umap.df[,paste0(m, c("_id","_label","_color"))] %>% unique colnames(tmp.df)=c("id","label","color") From 1837bf2313c17175b7a6ee5c1a8f1212095baaa3 Mon Sep 17 00:00:00 2001 From: cvanvelt Date: Wed, 30 Sep 2020 19:15:16 -0700 Subject: [PATCH 19/70] Updated plot_2d_umap_anno. --- R/reduceDimension_plot.R | 119 +- data/rd_plot_example/anno.df.rda | Bin 0 -> 5507196 bytes data/rd_plot_example/example_umap.csv | 7566 +++++++++++++++++++++++++ 3 files changed, 7658 insertions(+), 27 deletions(-) create mode 100644 data/rd_plot_example/anno.df.rda create mode 100644 data/rd_plot_example/example_umap.csv diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index abc1493..1e82913 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -480,41 +480,106 @@ plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missin -plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./",meta.fields=c("platform","joint_region"),alpha=0.5) - { - library(data.table) - library(dplyr) - library(ggplot2) - umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) - colnames(umap.df) = c("sample_name","Dim1","Dim2") - umap.df = umap.df[sample(1:nrow(umap.df)),] - umap.df = umap.df %>% left_join(anno.df) - umap.2d = umap.df[,c("Dim1","Dim2")] - row.names(umap.2d)=umap.df$sample_name - umap.2d = umap.2d[sample(1:nrow(umap.2d)),] - umap.fn = basename(umap.fn) - cl = setNames(umap.df$cl, umap.df$sample_name) - cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique - cl.color = setNames(cl.df$cluster_color, cl.df$cl) - cl.label = setNames(cl.df$cluster_label, cl.df$cl) - g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=alpha) - ggsave(g, file=file.path(dest.d, gsub(".csv",".pdf",umap.fn))) - ggsave(g, file=file.path(dest.d, gsub(".csv",".png",umap.fn))) - g= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha=alpha,label.center=FALSE) - ggsave(g, file=file.path(dest.d, gsub(".csv",".no.label.png",umap.fn))) +#' plot_2d_umap_anno +#' +#' @param umap.fn path to umap coordinates. CSV file containing sample_names and umap x/y coordinates +#' @param anno.df Sample annotations. The first column should be sample_name, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. +#' @param meta.fields base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. +#' @param dest.d path to save plots. +#' @param section_wedges Default is NULL. Use annotation to separate Can be used to generate lines between sections to divide leaves of dendrogram, e.g. separating subclass, class. +#' @param alpha level of transparency of dots. Value between 0 (fully transparent) and 1 (fully opaque) +#' + +#' @example_data: +#' +#' load("data/plot_example/umap.csv") +#' load("data/plot_example/anno.df.rda") +#' +#' +#' @usage plots <- plot_2d_umap_anno(umap.fn="data/rd_plot_example/example_umap.csv",anno.df=anno.df, dest.d="./", meta.fields=c("platform","joint_region"),show.label=TRUE,alpha=0.5, cex=0.15,save.format="both") +#' +#' +#' + + +plot_2d_umap_anno <- function(umap.fn, + anno.df, + dest.d="./", + meta.fields=NULL, + show.label=TRUE, + alpha=0.65, + cex=0.25, + save.format=c("png","pdf","both"), + plot.size=7) +{ + library(data.table) + library(dplyr) + library(ggplot2) + + #load umap from csv + umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) + colnames(umap.df) = c("sample_name","Dim1","Dim2") + umap.df = umap.df[sample(1:nrow(umap.df)),] + umap.df = umap.df %>% left_join(anno.df) + umap.2d = umap.df[,c("Dim1","Dim2")] + row.names(umap.2d)=umap.df$sample_name + umap.2d = umap.2d[sample(1:nrow(umap.2d)),] + # extract filename for saving + umap.fn = basename(umap.fn) + umap.fn <- gsub(".csv", "",umap.fn) + + #setup cluster labels/colors for plotting + cl = setNames(umap.df$cl, umap.df$sample_name) + cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique + cl.color = setNames(cl.df$cluster_color, cl.df$cl) + cl.label = setNames(cl.df$cluster_label, cl.df$cl) + + plot.list <- list() + #plot umap colored by cluster + if(show.label==TRUE) { + g1= plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex) + plot.list$cluster <- g1 + } else { + g1= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha,label.center=FALSE) + plot.list$cluster <- g1 + } + + if(!is.null(meta.fields)) { + # plot umap colored by other metadata for(m in meta.fields){ tmp.df = umap.df[,paste0(m, c("_id","_label","_color"))] %>% unique colnames(tmp.df)=c("id","label","color") tmp.df = tmp.df %>% arrange(id) tmp.color = setNames(as.character(tmp.df$color), tmp.df$label) - g= plot_RD_meta(umap.2d, factor(umap.df[,paste0(m, "_label")], levels=names(tmp.color)),meta.col = tmp.color,alpha=0.5) - ggsave(g, file=file.path(dest.d, gsub("csv",paste0(m,".pdf"),umap.fn)),height=7,width=8.5) - ggsave(g, file=file.path(dest.d, gsub("csv",paste0(m,".png"),umap.fn)),height=7,width=8.5) + g= plot_RD_meta(umap.2d, factor(umap.df[,paste0(m, "_label")], levels=names(tmp.color)),meta.col = tmp.color,alpha=alpha) + g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ + theme_void() + + theme(legend.position="none") + + coord_fixed(ratio=1) + plot.list[[m]] <- g } - return(umap.2d) } - + + #save list of plots as pdf or png + if(save.format == "pdf") { + lapply(names(plot.list), function(nm) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.size, width=plot.size )) + } else if(save.format == "png"){ + lapply(names(plot.list), function(nm) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.size, width=plot.size )) + } else if(save.format == "both"){ + lapply(names(plot.list), function(nm) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.size, width=plot.size )) + + lapply(names(plot.list), function(nm) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.size, width=plot.size )) + } + else{ print("Specify save.format") + } + + return(plot.list) +} diff --git a/data/rd_plot_example/anno.df.rda b/data/rd_plot_example/anno.df.rda new file mode 100644 index 0000000000000000000000000000000000000000..a21443bf1426240e5d5104874a56f02f94dcab89 GIT binary patch literal 5507196 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

BaX_X;3ustYX4(($fM+$Patum>9S#OQ8|EEq5= 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%0AofcvE08tqyg)=dt}F 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

~5@M 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 zWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!Y zNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3 z$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd) zkdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6 zkRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?o zAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgB zAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrE zLqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&M zLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IT zhJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxoj zgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx z3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD4 z2^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W z84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE8 z5;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($ zG9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xiWJt)6kRc&MLWYD42^kVH zBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!YNXU?oAt6IThJ*|W84@xi zWJt)6kRc&MLWYD42^kVHBxFd)kdPrELqdjx3<(($G9+Y3$dHgBAwxojgbWE85;7!Y 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 literal 0 HcmV?d00001 diff --git a/data/rd_plot_example/example_umap.csv b/data/rd_plot_example/example_umap.csv new file mode 100644 index 0000000..662a555 --- /dev/null +++ b/data/rd_plot_example/example_umap.csv @@ -0,0 +1,7566 @@ +,0,1 +10X_cells.CTGAAGTAGCATCATC-L8TX_180221_01_F12,10.117515,10.5931015 +10X_cells.CGATTGACACGAAATA-L8TX_180406_01_F06,10.108393,10.351468 +10X_cells.GTAACGTAGGAGTTGC-L8TX_200625_02_F11,9.812248,11.5816765 +10X_cells.TGCCCATAGAGCCTAG-L8TX_200625_02_G11,9.823639,11.55492 +10X_cells.GCCAAATTCTAAGCCA-L8TX_200625_02_E11,9.901783,11.716275 +10X_cells.CCTATTAAGTTGAGTA-L8TX_200625_02_E11,11.520385,9.567223 +Smartseq_cells.SM-GE65P_S354_E1-50,10.271382,10.838027 +Smartseq_cells.SM-GE8ZQ_S248_E1-50,10.149795,9.742104 +Smartseq_cells.SM-GE8ZS_S053_E1-50,10.190564,10.390399 +Smartseq_cells.SM-GE8ZT_S351_E1-50,10.100258,10.843164 +10X_cells.CCCTCCTGTAGCTTGT-L8TX_180221_01_B10,10.050946,11.753334 +10X_cells.CTCGTACCAGTATAAG-L8TX_180406_01_F07,10.110423,11.559268 +Smartseq_cells.SM-GE65P_S116_E1-50,10.650851,10.357478 +Smartseq_cells.SM-GE65P_S381_E1-50,10.03497,11.744267 +Smartseq_cells.SM-GE65S_S145_E1-50,10.105241,11.246835 +Smartseq_cells.SM-GE8ZQ_S162_E1-50,10.037995,11.620091 +Smartseq_cells.SM-GE8ZQ_S168_E1-50,9.972011,11.692396 +Smartseq_cells.SM-GE8ZR_S231_E1-50,10.369582,10.918383 +Smartseq_cells.SM-GE8ZR_S334_E1-50,10.181672,11.19298 +Smartseq_cells.SM-GE8ZT_S382_E1-50,10.395234,10.265471 +Smartseq_cells.SM-GE91C_S271_E1-50,9.963841,9.4139385 +10X_cells.CCACGGAGTCGCTTTC-L8TX_200625_02_E11,10.123029,8.93908 +10X_cells.ACACTGAGTTCGCTAA-L8TX_200625_02_E11,9.652439,9.776232 +10X_cells.CATCCACTCGTGGGAA-L8TX_200625_02_E11,10.049289,9.848044 +10X_cells.CCAATCCCACTTAACG-L8TX_200625_02_E11,10.109999,9.771669 +10X_cells.CCAGCGATCCCAACGG-L8TX_200625_02_E11,9.852242,9.934354 +10X_cells.GAAGCAGCAGGAATCG-L8TX_200625_02_E11,9.668751,9.745274 +Smartseq_cells.SM-GE8ZQ_S041_E1-50,9.839406,9.960216 +Smartseq_cells.SM-GE8ZQ_S106_E1-50,9.982909,9.817348 +Smartseq_cells.SM-GE8ZR_S217_E1-50,9.943556,9.803363 +Smartseq_cells.SM-GE8ZT_S005_E1-50,9.677552,9.659232 +Smartseq_cells.SM-GE8ZT_S161_E1-50,9.68018,9.858303 +Smartseq_cells.SM-GE8ZU_S063_E1-50,9.706907,9.864636 +Smartseq_cells.SM-GE8ZU_S302_E1-50,9.822368,9.925409 +10X_cells.CAGAATCCACGAAAGC-L8TX_180406_01_E02,10.790818,8.833394 +10X_cells.TAGTTGGGTATTCTCT-L8TX_180406_01_E06,11.083396,7.981215 +10X_cells.TCAGCTCAGCTATGCT-L8TX_180406_01_C08,11.422219,7.483476 +10X_cells.GTCGGGTGTCGCTTCT-L8TX_180406_01_C07,11.110666,8.68775 +10X_cells.TGAAAGATCTCTTATG-L8TX_180406_01_C07,10.84765,8.47672 +10X_cells.CGGACGTAGCTCCCAG-L8TX_180406_01_H01,10.649851,9.517551 +10X_cells.GTACTTTGTTATGTGC-L8TX_180406_01_C08,10.883685,9.142415 +10X_cells.ACTATCTAGTGAAGAG-L8TX_180406_01_C07,10.633267,9.647977 +Smartseq_cells.SM-GE91R_S118_E1-50,11.123983,8.033583 +10X_cells.TAAGAGATCTTGTTTG-L8TX_180406_01_F06,10.365944,9.947396 +10X_cells.CGATGTACACCAGTTA-L8TX_200625_02_E11,10.661669,9.042927 +Smartseq_cells.SM-GE8ZR_S278_E1-50,10.497981,9.48829 +10X_cells.ACGCAGCAGCTGTCTA-L8TX_180406_01_B01,10.98663,9.309227 +10X_cells.CCACTACCACAACGTT-L8TX_180406_01_H01,11.611185,9.7324705 +10X_cells.CCCTCCTTCTACTTAC-L8TX_180406_01_H01,11.490818,9.388743 +10X_cells.CGTGTAACAGGGTACA-L8TX_180406_01_H01,11.725536,9.864804 +10X_cells.TAGCCGGTCAAACAAG-L8TX_180406_01_H01,11.52452,9.816115 +10X_cells.TCTTCGGTCCAAGTAC-L8TX_180406_01_H01,11.419079,10.415017 +10X_cells.TTAACTCTCCTAGTGA-L8TX_180406_01_H01,11.600751,9.734449 +10X_cells.AGCTCCTGTACGCACC-L8TX_180406_01_E02,11.412427,10.783974 +10X_cells.CTAGCCTGTTCTGTTT-L8TX_180406_01_E02,11.3080635,10.592273 +10X_cells.GTTAAGCCACTGCCAG-L8TX_180406_01_H02,11.346227,10.521032 +10X_cells.TGTTCCGTCTTGTTTG-L8TX_180406_01_H02,11.547295,9.13987 +10X_cells.ACGGAGAGTCCGACGT-L8TX_180406_01_B06,11.887185,9.693228 +10X_cells.ACGATGTAGGAATCGC-L8TX_180406_01_E06,11.4044695,9.981878 +10X_cells.AGAGTGGCACAACGCC-L8TX_180406_01_C08,11.766198,10.116733 +10X_cells.TGCGCAGCAGGCTGAA-L8TX_180406_01_C08,11.764767,9.191564 +10X_cells.ATCCACCAGAAGGCCT-L8TX_180406_01_C07,11.355841,10.582882 +10X_cells.CAACCTCTCCAGAGGA-L8TX_180406_01_C07,11.416405,10.096579 +10X_cells.GTCTCGTGTGCAACGA-L8TX_180406_01_E07,11.867725,10.021091 +Smartseq_cells.SM-GE91L_S137_E1-50,11.312436,11.92374 +Smartseq_cells.SM-GE91G_S342_E1-50,11.249502,11.14121 +Smartseq_cells.SM-GE91J_S037_E1-50,11.25513,11.491978 +Smartseq_cells.SM-GE91J_S227_E1-50,11.307572,11.848526 +Smartseq_cells.SM-GE914_S070_E1-50,11.316223,11.950653 +10X_cells.AGGGAGTTCTGTCTCG-L8TX_180406_01_B01,11.691372,9.1849985 +10X_cells.CAGAATCTCTCAAACG-L8TX_180406_01_D02,11.46375,9.922065 +10X_cells.TACTTGTGTCTCTTTA-L8TX_180406_01_D02,11.755952,9.279875 +10X_cells.ACAGCCGTCTGCGTAA-L8TX_180406_01_H01,11.327003,9.765129 +10X_cells.GCTCTGTCATAGTAAG-L8TX_180406_01_H01,11.003005,8.916751 +10X_cells.TGCTACCGTACATCCA-L8TX_180406_01_H01,10.938307,9.769992 +10X_cells.AAACGGGAGATCGGGT-L8TX_180406_01_E02,11.378671,9.525668 +10X_cells.GCGACCACAATGGATA-L8TX_180406_01_E02,10.941492,9.782277 +10X_cells.CGACCTTAGCACGCCT-L8TX_180406_01_G02,10.8056755,9.835636 +10X_cells.CATCAAGTCAGCCTAA-L8TX_180406_01_H02,10.66593,9.799112 +10X_cells.GGTATTGGTAGCTGCC-L8TX_180406_01_H02,10.887382,9.156968 +10X_cells.GACACGCTCGACAGCC-L8TX_180406_01_E06,11.607348,9.374824 +10X_cells.GTCAAGTTCGAGAGCA-L8TX_180406_01_C08,11.16966,9.582593 +10X_cells.AAACCTGCACAACTGT-L8TX_180406_01_C07,10.70358,9.843699 +10X_cells.CGAACATCACTTCGAA-L8TX_180406_01_C07,11.651125,9.4389105 +10X_cells.CCACCTACAGTCTTCC-L8TX_180406_01_E02,11.599877,9.580666 +10X_cells.GGGAGATAGGGTTTCT-L8TX_180406_01_E02,11.316845,9.637811 +10X_cells.CAAGGCCAGCTGCCCA-L8TX_180406_01_G02,10.999186,9.695157 +10X_cells.ACCTTTAGTCTAAAGA-L8TX_180406_01_E06,11.896646,9.498278 +10X_cells.CTTGGCTGTAGCAAAT-L8TX_200625_02_E11,10.522852,9.782032 +10X_cells.GACCAATGTCTCACCT-L8TX_180406_01_D01,10.711222,9.885508 +10X_cells.CAAGATCGTAGCGCTC-L8TX_180406_01_G01,10.622292,9.326868 +10X_cells.CCTCTGAGTTGTTTGG-L8TX_180406_01_B02,11.258349,9.654872 +10X_cells.ATGCGATCATACTCTT-L8TX_180406_01_E01,11.28938,10.2628765 +Smartseq_cells.SM-GE93M_S338_E1-50,11.25956,10.612474 +10X_cells.CCAGCGAAGCGATGAC-L8TX_180712_01_H05,10.685985,9.660151 +10X_cells.GTCGGGTAGGCCCTTG-L8TX_180221_01_G09,2.2985513,1.6788546 +10X_cells.TGATTTCTCTGCTTGC-L8TX_180221_01_G09,1.2112843,1.8002902 +Smartseq_cells.SM-GE64P_S133_E1-50,3.7775156,8.847378 +10X_cells.CATCGAAAGTTAACGA-L8TX_180221_01_D09,2.3270712,1.6522182 +10X_cells.TCAGCAATCCTTTCGG-L8TX_180712_01_B06,1.7315049,1.6244751 +10X_cells.GGAATAATCACCATAG-L8TX_180221_01_D09,2.3546185,0.8227069 +10X_cells.CAGCATACAACTGCGC-L8TX_180221_01_C09,2.190176,3.3712697 +10X_cells.CGGACACGTGCACCAC-L8TX_180712_01_B06,3.0170405,-0.16682203 +10X_cells.GCTCCTAAGTGTCTCA-L8TX_180221_01_E09,1.7505292,3.0750422 +10X_cells.CCTTACGCATATACCG-L8TX_180221_01_C09,2.4157934,2.5515184 +10X_cells.CTCGTACTCGCAAACT-L8TX_180221_01_C09,2.6336946,0.5607962 +10X_cells.GTCACAAAGAAGGGTA-L8TX_180221_01_C09,1.7191391,1.3569894 +10X_cells.AGATTGCAGTGAACGC-L8TX_180221_01_D09,1.4260174,2.5197165 +10X_cells.GTGCTTCTCGTCTGAA-L8TX_180221_01_D09,1.776683,1.9843938 +10X_cells.AACTCTTAGGCCCTTG-L8TX_181011_01_C04,1.3709779,1.9564792 +10X_cells.CTGCCTACACGACGAA-L8TX_181011_01_H02,1.8185581,0.42526552 +10X_cells.GAAACTCTCCTATGTT-L8TX_180829_01_E10,1.5463487,3.5204258 +10X_cells.GGGAGATAGGCCCTCA-L8TX_180829_01_D10,2.0126483,3.3389878 +10X_cells.CCACTACCATGGAATA-L8TX_180907_01_G10,1.4641467,1.9546992 +10X_cells.TGAGCATCAGACGCCT-L8TX_181012_01_E05,2.3236508,1.9965756 +10X_cells.AAGGAGCAGGATTCGG-L8TX_180406_01_E07,2.0198596,1.8345208 +10X_cells.GCCTCTAAGCAGGCTA-L8TX_180406_01_H01,1.9588008,3.9494376 +10X_cells.TCAATCTAGACAGACC-L8TX_180406_01_H01,1.7783178,2.2933662 +10X_cells.ATTATCCTCTCCGGTT-L8TX_180406_01_E02,1.4246004,3.2706316 +10X_cells.TTCTTAGGTCTAGCGC-L8TX_180406_01_E02,1.2281615,1.2861512 +10X_cells.AAGGCAGGTGTGACCC-L8TX_180406_01_G02,0.92619973,2.2868085 +10X_cells.AGGGTGATCCAAATGC-L8TX_180406_01_G02,2.2232842,4.0444503 +10X_cells.GATTCAGAGGTAGCCA-L8TX_180406_01_E07,1.0933212,1.1480409 +Smartseq_cells.SM-GE91P_S290_E1-50,1.3935379,2.153739 +Smartseq_cells.SM-GE91P_S302_E1-50,2.214097,0.4745602 +10X_cells.CCACTACCACACCGCA-L8TX_171026_01_H05,1.6999794,0.4504485 +10X_cells.CACACTCTCTGTTTGT-L8TX_171026_01_F04,2.054144,3.827873 +10X_cells.CAAGTTGTCAAGGTAA-L8TX_171026_01_G04,2.083728,-0.15319283 +10X_cells.CTCTGGTGTTGTGGAG-L8TX_171026_01_B05,1.9720187,0.23135424 +10X_cells.GAATAAGTCACCCGAG-L8TX_171026_01_B05,1.3502951,3.142432 +10X_cells.ATGGGAGAGGACAGCT-L8TX_171026_01_A05,2.1746345,0.954351 +10X_cells.ATCATGGTCGGAAATA-L8TX_171026_01_H03,1.915912,0.7359904 +10X_cells.ATTCTACAGGTTCCTA-L8TX_171026_01_G05,1.6018215,1.4177089 +10X_cells.GGTGTTAAGGATGGAA-L8TX_180406_01_B01,2.275006,0.09928017 +10X_cells.TCGGTAAGTTTGGGCC-L8TX_180406_01_G01,2.924972,0.7973802 +10X_cells.TGTATTCGTCCGAGTC-L8TX_180406_01_C01,2.3976126,3.3234713 +10X_cells.CACTCCAGTAGCTAAA-L8TX_180406_01_D01,1.8514875,0.39337024 +10X_cells.GGAGCAAAGTTGAGTA-L8TX_180406_01_F01,2.0105453,1.7916561 +10X_cells.ACACCGGCACCATCCT-L8TX_180406_01_B02,0.8579064,1.4788541 +10X_cells.GGGTTGCTCTCTAAGG-L8TX_180406_01_C02,2.3890738,1.0741341 +10X_cells.CTTCTCTAGTTACCCA-L8TX_180406_01_D02,1.4969842,3.6481915 +10X_cells.GTCGGGTAGAAGGTGA-L8TX_180406_01_D02,2.9103353,1.3721215 +10X_cells.ACACCGGAGCATGGCA-L8TX_180221_01_D10,2.605588,1.3784995 +10X_cells.CGTCCATCACAGACTT-L8TX_180221_01_D10,2.3807962,2.77886 +10X_cells.AGTGAGGCACATGTGT-L8TX_180221_01_E10,1.9362928,1.6473523 +10X_cells.GTCGTAAAGTACGTAA-L8TX_180221_01_F10,1.2604299,2.3157382 +10X_cells.AGGGTGAGTCCGAATT-L8TX_180221_01_G10,2.6483438,2.7052734 +10X_cells.ATTACTCCACCTCGGA-L8TX_180221_01_H10,1.9582264,3.90633 +10X_cells.TATCTCATCCCAACGG-L8TX_190312_01_B02,1.2931368,3.1798716 +10X_cells.GGGAGATTCTTAGAGC-L8TX_190312_01_C02,3.0435212,0.062477376 +10X_cells.CTCTACGTCGGCTACG-L8TX_190312_01_D02,1.7282164,1.6496403 +10X_cells.TATTACCTCTCGTTTA-L8TX_190312_01_G02,1.4258976,2.7535992 +10X_cells.GGGAATGGTGAGTGAC-L8TX_181012_01_B05,2.0047371,4.0278225 +10X_cells.GCGCCAAAGCACAGGT-L8TX_180907_01_B11,1.9731885,3.17801 +10X_cells.CCTCAGTAGACTTGAA-L8TX_190312_01_F02,1.6594844,0.65558124 +10X_cells.ACTTGTTAGAGTGAGA-L8TX_180907_01_B12,2.00869,1.1637998 +10X_cells.GGGTCTGCATTAGGCT-L8TX_180907_01_E11,1.7553502,0.5599357 +10X_cells.GGATTACAGTGCGATG-L8TX_190312_01_F01,1.9225622,0.87729275 +Smartseq_cells.LS-15533_S90_E12-50,1.0395836,2.7475412 +Smartseq_cells.SM-D9D8J_S11_E1-50,0.9174213,2.6897254 +Smartseq_cells.SM-GE5UT_S232_E1-50,2.2543771,-0.49367264 +10X_cells.CTTCTCTCATAGACTC-L8TX_180926_01_F01,2.759111,1.1452831 +10X_cells.TAAGCGTCAGTAGAGC-L8TX_180926_01_F01,2.5090435,3.2258325 +10X_cells.GTTCATTTCCGTTGTC-L8TX_181011_01_A03,1.9764566,1.4770783 +Smartseq_cells.SM-GE91B_S011_E1-50,1.8978273,0.7102641 +Smartseq_cells.SM-GE91B_S021_E1-50,1.3608737,2.2422893 +10X_cells.CACCTTGCACGGTGTC-L8TX_180221_01_H11,2.5898383,1.828814 +10X_cells.TACACGATCCGCTGTT-L8TX_180712_01_H05,1.3703773,1.7247757 +10X_cells.CAGCAGCTCTTTACGT-L8TX_180221_01_C12,2.4715686,2.9208252 +10X_cells.TGCTACCCACATCCAA-L8TX_180221_01_C12,2.0322084,1.482655 +10X_cells.ATCATGGCACTGTCGG-L8TX_180221_01_H11,2.9959176,2.8080707 +Smartseq_cells.SM-GE679_S088_E1-50,0.8567586,2.6667228 +10X_cells.ATCCACCTCGACGGAA-L8TX_180115_01_B09,1.8383683,2.2529926 +10X_cells.TTTGTCAGTCTTTCAT-L8TX_180115_01_E11,1.513457,1.1056316 +10X_cells.GCATGCGTCAACGGGA-L8TX_180115_01_D09,1.9365745,2.3304856 +10X_cells.CTTAACTGTAGAAAGG-L8TX_180115_01_B09,1.67672,2.8849082 +10X_cells.CTCACACCATGCCTAA-L8TX_180115_01_C11,1.4134233,2.8594618 +10X_cells.AGCAGCCAGTGTGGCA-L8TX_180115_01_C09,1.6474197,2.6533797 +10X_cells.ATGTGTGCAAGCCGTC-L8TX_180115_01_D09,1.8845628,1.9160231 +10X_cells.GAACCTATCAGAAATG-L8TX_180115_01_B11,1.9502281,2.028743 +10X_cells.CCGTACTCAGTTCATG-L8TX_180115_01_C10,2.0205898,3.1994991 +10X_cells.CGAATGTGTCCAACTA-L8TX_180115_01_E10,1.9892962,2.8733437 +10X_cells.ACGGGTCAGGGATGGG-L8TX_180115_01_F10,2.0635922,2.796166 +10X_cells.GATCAGTGTGTCTGAT-L8TX_180115_01_F10,1.8400052,1.7018421 +10X_cells.GACGTTAGTTACGCGC-L8TX_180115_01_G10,2.157003,3.063886 +10X_cells.GTAACGTGTCTTGATG-L8TX_180115_01_G10,2.2556922,2.74745 +10X_cells.AAATGCCGTTTCGCTC-L8TX_180115_01_H09,2.4565372,2.980351 +10X_cells.CCCAGTTAGAACAATC-L8TX_180115_01_G09,2.437524,3.0046554 +10X_cells.GAACATCGTGCACGAA-L8TX_171120_01_G07,1.6936119,2.1951756 +10X_cells.AAACCTGAGCTGTTCA-L8TX_171120_01_C07,2.5115073,-0.099160336 +10X_cells.TTATGCTAGGCCCTCA-L8TX_171120_01_C07,1.9973754,0.08385724 +10X_cells.AACTCCCAGATATGCA-L8TX_180115_01_F08,1.1761831,3.2669263 +10X_cells.TGGCGCACACTGCCAG-L8TX_180115_01_C08,1.8789093,2.2355406 +Smartseq_cells.SM-D9CXQ_S61_E1-50,0.67593426,2.1016378 +Smartseq_cells.SM-DD45I_S045_E1-50,1.1657232,2.6025722 +Smartseq_cells.SM-GE8ZI_S057_E1-50,1.3658234,3.0257914 +Smartseq_cells.SM-GE92Z_S326_E1-50,1.7289494,1.4349936 +10X_cells.TCCCGATCACATCCAA-L8TX_180221_01_H09,0.5782151,3.1055322 +10X_cells.GGCGACTTCGAATCCA-L8TX_200625_02_E11,12.9745865,8.791336 +10X_cells.CATCGGGCATGAACCT-L8TX_200625_02_E11,1.5813849,-1.5238519 +Smartseq_cells.SM-GE8ZR_S111_E1-50,12.829636,8.17753 +Smartseq_cells.SM-GE915_S139_E1-50,12.963593,8.273713 +10X_cells.CATGACAAGAGGTTAT-L8TX_180406_01_B01,12.999617,8.149391 +10X_cells.CAGTAACAGCTGAAAT-L8TX_180406_01_C01,13.027937,7.6176972 +10X_cells.CTTCTCTCACTACAGT-L8TX_180406_01_C01,12.977695,8.200976 +10X_cells.CCTAAAGAGGGCTCTC-L8TX_180406_01_G01,13.048662,8.145893 +10X_cells.TTTGGTTTCTGCGTAA-L8TX_180221_01_D11,12.820943,7.9435234 +Smartseq_cells.SM-GE915_S089_E1-50,13.901654,6.410661 +Smartseq_cells.SM-GE91B_S051_E1-50,12.750043,8.292013 +10X_cells.CATCCACAGATGAGAG-L8TX_180712_01_G05,1.9739776,4.7317557 +10X_cells.TGGGAAGAGAGCTTCT-L8TX_180221_01_D09,4.308924,8.104595 +10X_cells.TATGCCCGTGTTAAGA-L8TX_181012_01_H04,2.1564496,4.2863936 +10X_cells.CGGGTCATCCAAGTAC-L8TX_180907_01_F10,4.0162873,10.854371 +10X_cells.CTGAAGTGTTATTCTC-L8TX_181012_01_H04,2.4708207,4.8118606 +10X_cells.GACCAATCAATAGCGG-L8TX_181011_01_G02,2.3048913,3.665163 +10X_cells.CAGCAGCCAGGTTTCA-L8TX_181011_01_C04,1.8129382,4.7607145 +10X_cells.TCATTACAGTGGTAAT-L8TX_180406_01_E07,2.2885056,3.841128 +10X_cells.CAGAGAGTCTTCGAGA-L8TX_180406_01_G02,2.8431735,9.960103 +10X_cells.TACGGGCCAGGAATGC-L8TX_180406_01_G02,3.530074,9.632075 +10X_cells.TAGAGCTGTAACGTTC-L8TX_180406_01_H02,-0.5992675,1.8130916 +Smartseq_cells.SM-GE91L_S171_E1-50,3.2959464,11.857917 +Smartseq_cells.SM-GE91R_S117_E1-50,1.6549845,4.2617154 +10X_cells.CTACCCACAAAGTGCG-L8TX_171026_01_A05,3.907445,11.2774105 +10X_cells.CACATAGAGATGCCTT-L8TX_181206_01_D12,2.329219,3.1788335 +10X_cells.ACTTGTTCAAGCTGTT-L8TX_180406_01_B01,4.892926,8.529473 +10X_cells.GAGCAGAAGTCCGGTC-L8TX_180406_01_D01,1.9864392,4.264606 +10X_cells.CGTCACTAGAAGGTGA-L8TX_180221_01_D10,3.847369,10.0748415 +10X_cells.GATGCTACATGGTAGG-L8TX_180221_01_A11,4.1623945,10.856796 +10X_cells.CAGGTGCCATTTCACT-L8TX_180221_01_D10,3.4829416,10.920451 +10X_cells.TTTACTGAGATCACGG-L8TX_180221_01_G10,2.2645612,3.871763 +10X_cells.GGAGCAATCTGCCAGG-L8TX_180221_01_H10,1.9665521,3.9940882 +10X_cells.GACACGCGTACCATCA-L8TX_190312_01_G02,3.9527483,10.222697 +10X_cells.CCTTACGCACAAGTAA-L8TX_181012_01_B05,1.3876731,3.9713674 +10X_cells.TCAGGTAAGTGTGGCA-L8TX_180221_01_C11,4.270242,11.254622 +10X_cells.AGTGAGGCAGACACTT-L8TX_180926_01_F01,1.7612782,4.3518963 +10X_cells.TTCTCAATCACAGGCC-L8TX_181011_01_C03,3.9736593,11.04563 +10X_cells.GCATACAGTAAAGGAG-L8TX_180221_01_A12,3.8438437,10.782559 +10X_cells.TAGGCATGTTCAGTAC-L8TX_180712_01_F05,2.8877554,4.702259 +10X_cells.GTAGGCCCACGGCCAT-L8TX_180221_01_H11,4.7167864,11.403199 +10X_cells.ATCGAGTTCAGAGCTT-L8TX_180712_01_A06,2.1844633,4.004079 +10X_cells.CGGACTGAGTTAGGTA-L8TX_180221_01_B12,2.183681,4.6354303 +10X_cells.GACTAACGTTCCACTC-L8TX_180115_01_C09,3.349726,11.172257 +10X_cells.GTATTCTGTATTCGTG-L8TX_180115_01_D09,4.1359644,10.737478 +10X_cells.ACTGCTCCACAACGCC-L8TX_180115_01_G11,4.0805492,11.088047 +10X_cells.CATCAGAAGGGTGTGT-L8TX_180115_01_A09,1.8636352,4.1871667 +10X_cells.GGAACTTCAGGGTTAG-L8TX_180115_01_G10,2.2364366,3.2668982 +10X_cells.AGTGGGACAAGTCTAC-L8TX_180115_01_G11,1.9026856,4.2032166 +10X_cells.ACGATACTCAGGATCT-L8TX_171120_01_G07,3.9887998,11.228548 +10X_cells.TAAGAGAGTTCCCTTG-L8TX_171120_01_D07,2.0577397,3.9205415 +10X_cells.TAAACCGCAAGCTGAG-L8TX_180406_01_F02,5.6321754,10.414518 +10X_cells.AGTGAGGAGGCATGTG-L8TX_180221_01_A10,6.019291,9.519863 +10X_cells.GTCTTCGGTAGCGTGA-L8TX_180221_01_A10,6.264954,9.194948 +10X_cells.CTCAGAAAGTCCTCCT-L8TX_180406_01_F02,6.105438,10.97247 +10X_cells.CTCTGGTAGACCCACC-L8TX_180406_01_C06,6.276623,9.692709 +Smartseq_cells.SM-DD45D_S060_E1-50,5.621795,11.450844 +10X_cells.CTCATTAGTATTAGCC-L8TX_180221_01_E09,4.6210265,11.9889965 +10X_cells.CATTCGCTCGTTGACA-L8TX_180221_01_H12,6.000395,10.493696 +10X_cells.GGAGCAAGTTACCAGT-L8TX_180221_01_H12,5.784763,11.466287 +10X_cells.ATAGACCAGACTAGAT-L8TX_180221_01_C09,6.507122,10.007898 +10X_cells.GCATACATCTCTTATG-L8TX_180221_01_C09,6.0697427,10.40996 +10X_cells.GCACATAAGGTGACCA-L8TX_180221_01_D09,6.4454803,10.549742 +10X_cells.ACACCGGTCGTCGTTC-L8TX_180607_01_C05,5.7367525,12.020026 +10X_cells.AAGGCAGCACGGATAG-L8TX_180712_01_G05,6.556576,10.040677 +10X_cells.TCAACGATCATGCTCC-L8TX_180712_01_G05,5.7780285,9.779248 +10X_cells.TTTGTCACACTTACGA-L8TX_180712_01_B06,4.6433764,12.28112 +10X_cells.CAGCATAAGAGGTACC-L8TX_180712_01_C06,5.6202884,12.332204 +10X_cells.CATCAGAAGTATCTCG-L8TX_180712_01_C06,5.798473,11.449602 +10X_cells.GTTCGGGCACTTGGAT-L8TX_180712_01_C06,5.7812643,10.613241 +Smartseq_cells.LS-15577_S18_E1-50,5.812074,11.542033 +Smartseq_cells.SM-GE635_S164_E1-50,5.6641574,11.614645 +Smartseq_cells.SM-GE672_S015_E1-50,5.067997,12.123268 +10X_cells.GCATGTACAAACTGCT-L8TX_180829_01_D09,6.132038,11.247423 +10X_cells.CTAGAGTGTTGATTGC-L8TX_180829_01_D10,5.810879,9.147975 +10X_cells.GCAATCATCAAGATCC-L8TX_180829_01_D10,5.943758,9.566812 +10X_cells.GTAACGTCACGAGGTA-L8TX_180829_01_D10,6.1053205,10.478617 +10X_cells.CCACTACTCAGCTTAG-L8TX_181012_01_G04,5.7469587,9.32962 +10X_cells.GGGCACTTCCTGCTTG-L8TX_181012_01_E05,5.456324,8.495537 +10X_cells.TTTGTCATCTTCATGT-L8TX_181012_01_E05,5.522051,8.902552 +10X_cells.AATCGGTGTATCGCAT-L8TX_180406_01_E06,5.5769343,8.745216 +10X_cells.CCTAGCTAGGGAACGG-L8TX_180406_01_E06,4.353463,9.614033 +Smartseq_cells.SM-GE91F_S258_E1-50,5.3975487,11.7244 +10X_cells.GTACTTTGTCAGAATA-L8TX_180406_01_F07,5.5064683,9.2762 +10X_cells.GCGAGAACAGCTGCAC-L8TX_171026_01_F05,5.5710034,12.249085 +10X_cells.TGCACCTGTAGGGACT-L8TX_171026_01_H04,5.384746,11.893776 +10X_cells.TCAGGTATCTGCTGCT-L8TX_171026_01_E05,5.4775023,12.43201 +10X_cells.GACCAATAGAAGGTGA-L8TX_171026_01_D05,4.2274613,12.458466 +10X_cells.GACTACACAAAGGTGC-L8TX_171026_01_D05,4.890837,11.490813 +10X_cells.ACATACGGTGCCTGTG-L8TX_171026_01_F03,5.8307548,12.203491 +10X_cells.ACGATACCAGGTGCCT-L8TX_171026_01_F03,5.550207,10.666043 +10X_cells.CGGTTAATCCCTCAGT-L8TX_171026_01_G03,4.450858,12.480148 +10X_cells.TCGGTAAAGTACGTTC-L8TX_171026_01_G03,5.7998853,11.83217 +10X_cells.TTCCCAGAGTGTTAGA-L8TX_171026_01_G03,5.406025,11.965622 +10X_cells.ACATACGGTGCATCTA-L8TX_171026_01_B04,5.4799247,12.471999 +10X_cells.AGACGTTTCGTACCGG-L8TX_171026_01_B04,5.3649955,9.822451 +10X_cells.CAACTAGTCCTTTCGG-L8TX_171026_01_G04,4.3767657,12.424293 +10X_cells.CGGAGTCCAGATGGGT-L8TX_171026_01_B05,5.835215,11.835346 +10X_cells.CATATTCCACCTATCC-L8TX_171026_01_A05,5.369763,12.332214 +10X_cells.CTCCTAGTCACGAAGG-L8TX_171026_01_H03,6.042234,11.09305 +10X_cells.GATGAAATCATCGGAT-L8TX_171026_01_H03,5.9137497,10.63398 +10X_cells.GCTTCCATCCACTCCA-L8TX_171026_01_H03,5.691938,9.451396 +10X_cells.GTGCGGTGTCATATCG-L8TX_171026_01_H03,5.6773973,9.280286 +10X_cells.TCTGAGATCAGTCAGT-L8TX_171026_01_H03,5.8990383,9.812138 +10X_cells.AGATCTGCACAACGTT-L8TX_171026_01_A04,5.7814736,12.288303 +10X_cells.CAAGATCCAGGAATCG-L8TX_171026_01_C05,6.348612,9.699834 +10X_cells.TCACAAGGTAAGTTCC-L8TX_171026_01_D05,5.4415374,11.533528 +10X_cells.TCACGAAAGCGATTCT-L8TX_171026_01_E05,5.70508,9.222829 +10X_cells.GGGTCTGTCTTGCATT-L8TX_171026_01_G05,5.9847136,9.645192 +10X_cells.ATGGGAGAGGCTATCT-L8TX_171026_01_H05,5.4233656,12.298204 +10X_cells.ACACCGGCAATGGAAT-L8TX_181206_01_B12,6.0244703,10.313687 +10X_cells.GAGGTGAGTCGAGTTT-L8TX_180406_01_B01,4.7125177,11.473914 +10X_cells.TGGGAAGCAAATACAG-L8TX_180406_01_C01,4.8613114,8.734174 +10X_cells.ATCTACTTCCAGAGGA-L8TX_180406_01_D01,5.358375,8.576413 +10X_cells.ACACTGAGTTCCCTTG-L8TX_180406_01_E01,5.4339647,8.55245 +10X_cells.CCGTGGACACGCGAAA-L8TX_180406_01_F01,6.219613,9.701829 +10X_cells.GCACATACACTACAGT-L8TX_180406_01_F01,5.1746087,12.005909 +Smartseq_cells.SM-GE671_S136_E1-50,5.1774287,10.661331 +10X_cells.TCTCATAAGCGATGAC-L8TX_180221_01_D10,4.3337502,10.003495 +10X_cells.TGTCCCAGTTGCGCAC-L8TX_190312_01_B02,6.5791655,10.552631 +10X_cells.CTCGAAATCGTTGCCT-L8TX_180221_01_G10,5.519354,10.606055 +10X_cells.AGCTTGACACGAAAGC-L8TX_180221_01_D10,5.0024524,11.501491 +10X_cells.ATTGGTGGTCGGCATC-L8TX_180221_01_D10,5.59131,12.347608 +10X_cells.CCAGCGAAGGCTACGA-L8TX_180221_01_D10,5.7047253,9.3724785 +10X_cells.GGCTGGTAGTTATCGC-L8TX_180221_01_D10,5.7025256,10.017476 +10X_cells.GTGAAGGTCGTCGTTC-L8TX_180221_01_D10,6.029767,10.088572 +10X_cells.AAGCCGCCACCAGCAC-L8TX_180221_01_E10,5.619789,12.361655 +10X_cells.ACTTTCACAATCTGCA-L8TX_180221_01_E10,5.4893126,10.180822 +10X_cells.GGAATAATCGTACCGG-L8TX_180221_01_E10,4.909504,11.108291 +10X_cells.TGCGGGTAGTGTACGG-L8TX_180221_01_E10,4.981322,9.6466255 +10X_cells.TGTATTCTCTGCGTAA-L8TX_180221_01_E10,4.5239353,11.304497 +10X_cells.CGATGGCGTTATTCTC-L8TX_180221_01_F10,6.252153,9.943763 +10X_cells.GAATAAGGTACGCTGC-L8TX_180221_01_F10,5.03746,11.20516 +10X_cells.ATTGGTGGTCCAAGTT-L8TX_180221_01_G10,5.7928686,10.033962 +10X_cells.CACAAACCACACCGAC-L8TX_180221_01_G10,5.5470676,9.180995 +10X_cells.CTCATTAGTGGGTCAA-L8TX_180221_01_G10,5.3535566,10.430204 +10X_cells.GATGAAAAGTGGTCCC-L8TX_180221_01_G10,5.2271304,9.5723505 +10X_cells.GGGTTGCCAATGGATA-L8TX_180221_01_H10,5.631538,11.194951 +10X_cells.AGCTTGAGTAAGGGAA-L8TX_180221_01_A11,4.87889,10.510861 +10X_cells.CCTTACGGTAGCGCTC-L8TX_180221_01_A11,5.818679,11.670259 +10X_cells.TGAAAGAAGTCCGTAT-L8TX_180221_01_A11,5.3160386,10.28582 +10X_cells.GCAAACTGTTGTGGAG-L8TX_190312_01_D02,5.288456,10.656934 +10X_cells.TGTATTCCATCGATGT-L8TX_190312_01_G02,4.531099,11.900791 +10X_cells.AGGGTGAGTGTTGGGA-L8TX_180926_01_C12,5.8864803,11.29152 +10X_cells.TCGGTAATCCCTGACT-L8TX_181012_01_C05,5.0645914,9.347979 +10X_cells.CGTGTCTTCACTTCAT-L8TX_180221_01_G11,6.9842277,9.935067 +10X_cells.TTGGCAAAGCTGGAAC-L8TX_180221_01_B11,6.884642,9.434752 +10X_cells.GACCTGGTCTGTCTAT-L8TX_180221_01_E11,6.773049,10.187031 +10X_cells.ATTGGTGAGGCTATCT-L8TX_180221_01_F11,6.3114314,10.975864 +10X_cells.CGATCGGTCCGAGCCA-L8TX_180907_01_A12,6.230774,10.73045 +10X_cells.CAGCCGAGTGCCTGCA-L8TX_180907_01_E11,6.354216,10.146675 +10X_cells.ATCTACTTCTATGTGG-L8TX_180907_01_F11,5.79367,9.682682 +Smartseq_cells.LS-15533_S94_E12-50,5.037447,12.064844 +10X_cells.CGTTGGGCACTAGTAC-L8TX_180926_01_D01,5.445931,8.564982 +10X_cells.CAGAATCTCAGTGCAT-L8TX_181011_01_B03,4.952531,9.886796 +10X_cells.GCAGTTATCAGAAATG-L8TX_180926_01_B01,5.6592503,9.499293 +10X_cells.CCAGCGAAGTTGTAGA-L8TX_180926_01_B01,6.141501,10.128603 +10X_cells.ACGAGGATCTTAGCCC-L8TX_180926_01_E01,5.7307754,9.83339 +10X_cells.CACAGGCCATTACGAC-L8TX_180926_01_E01,5.3677034,9.970487 +10X_cells.CACCACTTCGCGTAGC-L8TX_180926_01_E01,5.774466,11.480817 +10X_cells.GGCGTGTGTTGTGGCC-L8TX_180926_01_F01,6.1045046,10.938796 +10X_cells.CTCTACGGTCTAGTGT-L8TX_181011_01_A03,5.4030123,8.594389 +10X_cells.CGCGTTTTCCGCATAA-L8TX_181011_01_C03,6.009608,10.415488 +10X_cells.TACCTATGTCCGTCAG-L8TX_180221_01_C12,5.357079,9.209388 +10X_cells.AGTAGTCGTTGATTCG-L8TX_180712_01_H05,5.3568687,9.135757 +10X_cells.CTACGTCGTCTCAACA-L8TX_180712_01_H05,5.551984,9.168184 +10X_cells.CTCGTCAGTCTAGCCG-L8TX_180712_01_A06,5.29679,10.358566 +10X_cells.AACCGCGTCTTATCTG-L8TX_180504_01_E01,5.483199,8.60814 +10X_cells.AACGTTGGTGAGGCTA-L8TX_180504_01_E01,5.4566383,8.9211 +10X_cells.CGGACTGGTCTGCGGT-L8TX_180504_01_E01,5.075537,8.761834 +10X_cells.GGATTACCAAGTCTGT-L8TX_180504_01_E01,5.496488,10.168352 +10X_cells.GAAACTCAGGTGTGGT-L8TX_180221_01_A12,6.648876,9.65842 +10X_cells.GGATTACCATGTTGAC-L8TX_180221_01_B12,5.944324,9.10204 +10X_cells.GAATAAGTCCAGTAGT-L8TX_180221_01_C12,5.8854656,9.204375 +10X_cells.GTCTTCGAGTGAACAT-L8TX_180221_01_C12,6.0709863,8.884151 +10X_cells.CATCGAAGTGTAAGTA-L8TX_180221_01_H11,6.8996797,9.372301 +10X_cells.AGAGCTTCAATGCCAT-L8TX_200611_02_A05,4.1681986,10.698585 +10X_cells.GTCATTTTCATGCTCC-L8TX_200611_02_A05,5.2613516,9.724949 +10X_cells.GAATAAGCAAGCCGCT-L8TX_180115_01_A10,6.694253,10.131942 +10X_cells.GATCTAGCAATAGAGT-L8TX_180115_01_H11,5.412562,9.856982 +10X_cells.AAGCCGCCATCGGTTA-L8TX_180115_01_G11,5.574849,10.181476 +10X_cells.CCGTGGACATCGTCGG-L8TX_180115_01_F11,5.6898007,8.830198 +10X_cells.TCGGGACAGTACTTGC-L8TX_180115_01_H11,5.395125,11.751986 +10X_cells.GTGTTAGAGTTTGCGT-L8TX_180115_01_E11,5.467406,12.386254 +10X_cells.ATAAGAGGTTTGGGCC-L8TX_180115_01_H11,5.92706,11.503892 +10X_cells.TCTGAGAGTTATCCGA-L8TX_180115_01_C11,6.676773,10.013155 +10X_cells.AGCTCCTTCAAACAAG-L8TX_180115_01_A09,6.027472,11.123643 +10X_cells.GGCAATTCAGTTCCCT-L8TX_180115_01_B09,5.8575225,11.416833 +10X_cells.TCTTTCCGTCGCTTCT-L8TX_180115_01_C09,6.3717527,10.816102 +10X_cells.CGTGAGCGTAGGCTGA-L8TX_180115_01_D09,6.4355125,10.932137 +10X_cells.CTGCCTACACACAGAG-L8TX_180115_01_D09,6.5287986,9.99411 +10X_cells.TGCCAAAAGCGTTGCC-L8TX_180115_01_A11,6.169913,9.02457 +10X_cells.CGATGTAGTGATGTCT-L8TX_180115_01_H10,6.4491467,9.463771 +10X_cells.AAGGAGCCACCATCCT-L8TX_180115_01_B11,5.9776826,11.31223 +10X_cells.GGGACCTAGATCCCAT-L8TX_180115_01_D11,5.8262105,12.162502 +10X_cells.CATTATCTCTTGACGA-L8TX_180115_01_F10,6.6917295,10.632558 +10X_cells.GAACCTATCCAAGTAC-L8TX_180115_01_F10,5.9266567,11.28525 +10X_cells.GCTTGAACAAGCCCAC-L8TX_180115_01_G10,6.31083,9.048432 +10X_cells.GGCGTGTCATATGCTG-L8TX_180115_01_G10,6.5509067,9.674929 +10X_cells.GGTGCGTGTACCGCTG-L8TX_180115_01_E11,5.551171,12.194747 +10X_cells.TAAGTGCTCGTCACGG-L8TX_180115_01_H11,5.891822,10.4330015 +10X_cells.TCAACGAGTCTAAAGA-L8TX_180115_01_H09,6.439972,9.244442 +10X_cells.AAGGAGCCAATCTACG-L8TX_180115_01_E09,5.820744,11.455551 +10X_cells.AGGTCCGCAGCTCGCA-L8TX_180115_01_G08,5.5335336,11.360686 +10X_cells.ACGGAGACATCTACGA-L8TX_171120_01_G07,5.269015,12.322544 +10X_cells.GAGTCCGGTCATTAGC-L8TX_171120_01_G07,5.765315,9.732233 +10X_cells.GTAACTGAGCAATATG-L8TX_171120_01_H07,6.026987,9.738957 +10X_cells.ATCTACTCATGTCTCC-L8TX_180115_01_G08,5.452417,10.628892 +10X_cells.GTAACTGCAGTGACAG-L8TX_171120_01_C07,4.9830527,12.088966 +10X_cells.ATCACGAAGCTAGGCA-L8TX_171120_01_E07,5.896141,11.705043 +10X_cells.CGTGTAAAGCGTTTAC-L8TX_171120_01_E07,5.759834,11.367538 +10X_cells.TGGCCAGGTACCGAGA-L8TX_171120_01_E07,5.6207266,8.815151 +10X_cells.CTACCCATCGGTCCGA-L8TX_180115_01_F08,5.357278,10.743778 +10X_cells.CTCACACTCGACGGAA-L8TX_180115_01_C08,5.657126,8.782324 +10X_cells.CCACCTAGTCGGCATC-L8TX_180115_01_E08,5.1080675,11.2395735 +Smartseq_cells.LS-15001_S18_E1-50,4.9475036,12.141486 +Smartseq_cells.LS-15064_S03_E1-50,4.944809,11.916436 +Smartseq_cells.LS-15347_S69_E1-50,5.8042455,11.379272 +Smartseq_cells.LS-15347_S77_E1-50,5.758699,10.937493 +Smartseq_cells.LS-15521_S88_E1-50,5.428902,11.697906 +Smartseq_cells.LS-15521_S90_E1-50,5.104404,11.877941 +Smartseq_cells.SM-GE65Y_S040_E1-50,5.6642323,11.340642 +Smartseq_cells.SM-GE65Y_S152_E1-50,5.1182737,11.823256 +Smartseq_cells.SM-GE92Z_S327_E1-50,5.995241,11.02423 +10X_cells.GTCAAGTGTCAGAATA-L8TX_180221_01_H09,4.474526,9.828586 +10X_cells.ATCTGCCCAAGTTCTG-L8TX_180406_01_F02,4.2779403,10.02304 +10X_cells.TCATTTGGTTGCGCAC-L8TX_180221_01_C10,2.0105608,5.096509 +10X_cells.TGCGTGGAGCTAGGCA-L8TX_180221_01_C10,5.615147,9.719417 +Smartseq_cells.LS-15310_S19_E2-50,5.041383,11.59613 +10X_cells.ATGGGAGAGTGTACTC-L8TX_180406_01_E02,4.4806423,9.376811 +10X_cells.GACGGCTAGCTGCGAA-L8TX_180406_01_B06,5.036827,8.899113 +10X_cells.GAACCTATCGCTTAGA-L8TX_171026_01_G03,3.9627593,9.5366745 +10X_cells.TCAGCTCGTGAGTATA-L8TX_171026_01_H05,3.7720168,8.350413 +10X_cells.GAACATCTCCGCATAA-L8TX_171026_01_F04,3.792396,9.052812 +10X_cells.TGACAACGTCTGCCAG-L8TX_180406_01_B01,4.8769016,11.024857 +10X_cells.CAGCTAAGTCACTTCC-L8TX_180406_01_E01,0.44975442,2.480645 +10X_cells.TACTTGTGTGATAAGT-L8TX_180406_01_B02,3.7566028,9.786666 +10X_cells.GATCTAGGTAGCTCCG-L8TX_180406_01_E01,3.492504,9.35469 +10X_cells.ATTACTCGTGCACTTA-L8TX_180406_01_D02,4.238353,9.124806 +10X_cells.TGACGGCGTGAAAGAG-L8TX_180406_01_D02,4.50544,10.267889 +10X_cells.GGACAAGCAGGATTGG-L8TX_180406_01_F01,-0.037398655,1.902195 +10X_cells.GCCAAATCAAATCCGT-L8TX_180406_01_B01,2.756379,11.158346 +10X_cells.CCATTCGCAGGGTACA-L8TX_180406_01_E01,4.2450194,9.4369335 +10X_cells.CCCATACAGTGAACGC-L8TX_180406_01_E01,4.5074224,9.711929 +10X_cells.ACGATACGTAAGGATT-L8TX_180406_01_C02,4.0349216,9.704081 +Smartseq_cells.SM-GE66Z_S189_E1-50,5.757476,11.079514 +10X_cells.CACAGTATCAGGCCCA-L8TX_180221_01_D10,4.6801076,9.569819 +10X_cells.TGACTAGAGCTGAAAT-L8TX_190312_01_C02,3.8822484,9.831572 +10X_cells.GGTGAAGTCATGCATG-L8TX_180221_01_H10,4.2043753,10.5916195 +10X_cells.AGCTCTCTCCTTGGTC-L8TX_180221_01_H10,4.1363034,10.663315 +10X_cells.CTAGTGAAGGCTATCT-L8TX_180221_01_A11,1.8118898,4.374909 +10X_cells.AATCCAGCAGTGAGTG-L8TX_181012_01_B05,4.720409,11.660948 +10X_cells.GTGAAGGTCCCGGATG-L8TX_180221_01_D11,4.2449503,12.143 +10X_cells.GGACAAGTCTATCCCG-L8TX_180221_01_E11,4.560564,11.77597 +10X_cells.TGCGGGTAGATCTGAA-L8TX_180221_01_B11,6.9548855,9.994463 +10X_cells.CGGAGTCCAAGTAATG-L8TX_180221_01_C11,4.238027,12.24835 +10X_cells.ATGTGTGGTCACACGC-L8TX_180926_01_F01,4.2988067,9.537979 +Smartseq_cells.SM-GE91B_S014_E1-50,4.173106,11.562092 +10X_cells.CGAATGTGTTATCGGT-L8TX_180221_01_H11,6.7734756,9.426768 +10X_cells.AGAGCGACAACTTGAC-L8TX_180115_01_F10,3.8628247,10.592125 +10X_cells.TTCTCCTTCATGGTCA-L8TX_180115_01_E08,4.686237,11.158287 +Smartseq_cells.LS-15077_S60_E1-50,4.7430797,11.515573 +Smartseq_cells.SM-GE65Y_S053_E1-50,4.291385,10.676203 +Smartseq_cells.SM-GE65Y_S153_E1-50,4.680044,10.954002 +10X_cells.GTACTTTGTCCCTTGT-L8TX_180221_01_F09,1.702982,14.381736 +10X_cells.TCGCGTTTCCGTTGTC-L8TX_180221_01_F09,3.0915926,13.076709 +10X_cells.ACATGGTAGGGTGTGT-L8TX_180221_01_H09,3.307795,11.898236 +10X_cells.TGGGCGTTCGACCAGC-L8TX_180221_01_E09,4.7651234,11.9318905 +10X_cells.ACCGTAATCTAGAGTC-L8TX_180221_01_C09,2.9187455,12.1442795 +10X_cells.CCACCTAGTGAAATCA-L8TX_180221_01_C09,3.2143388,12.006361 +10X_cells.GTGTGCGTCCCTCAGT-L8TX_180221_01_C09,3.0015206,11.102542 +10X_cells.TAGCCGGTCGGTTCGG-L8TX_180221_01_D09,2.9525378,12.403735 +10X_cells.ATAAGAGAGTGACTCT-L8TX_180712_01_G05,2.560092,12.991796 +10X_cells.CTAGCCTAGAGATGAG-L8TX_180712_01_G05,2.8704615,11.386609 +10X_cells.AAAGCAATCGCATGGC-L8TX_180712_01_B06,2.4793348,14.019899 +10X_cells.TATCAGGAGGCGCTCT-L8TX_180712_01_C06,2.0153906,11.171733 +Smartseq_cells.LS-15323_S53_E2-50,3.1723325,12.734846 +Smartseq_cells.LS-15338_S37_E1-50,1.2155713,14.817644 +10X_cells.CCACCTATCTTCATGT-L8TX_180907_01_G10,3.4824624,12.620415 +10X_cells.CGATGTAAGGCCCGTT-L8TX_181012_01_G04,0.14560099,11.5886345 +10X_cells.TGAGCCGAGGACCACA-L8TX_181012_01_G04,0.025241466,9.936208 +Smartseq_cells.SM-GE5VU_S256_E1-50,1.1163393,14.732542 +10X_cells.CAGCTGGGTTAAGATG-L8TX_180406_01_H02,2.4499145,13.305929 +10X_cells.GTTCTCGGTGCTGTAT-L8TX_180406_01_E07,1.7948669,12.185884 +10X_cells.CAGCGACAGTCATCCA-L8TX_180406_01_H01,2.5870323,10.983371 +10X_cells.GGTGAAGCAACACCTA-L8TX_180406_01_H01,2.3411846,12.104027 +10X_cells.CTTTGCGTCTCTGTCG-L8TX_180406_01_B06,2.5910702,12.575375 +10X_cells.CAACCAAGTTAGGGTG-L8TX_180406_01_C08,3.480049,9.435218 +10X_cells.GCCTCTAAGACTACAA-L8TX_180406_01_C07,2.5735748,12.535093 +Smartseq_cells.SM-GE91L_S248_E1-50,3.1678834,12.099321 +10X_cells.ATGGGAGCAAAGCAAT-L8TX_200625_02_E11,2.6695657,12.064573 +10X_cells.ACACTGATCACCAGGC-L8TX_171026_01_C05,3.2969587,12.722755 +10X_cells.TCACAAGAGTGCGATG-L8TX_171026_01_H04,1.8665206,14.637228 +10X_cells.CATCAAGCATTATCTC-L8TX_171026_01_F03,-0.1109104,13.423949 +10X_cells.CACACTCGTTCACCTC-L8TX_171026_01_F04,1.2108042,15.214367 +10X_cells.TGCGTGGTCACTCCTG-L8TX_171026_01_G04,2.2672098,14.290679 +10X_cells.AATCCAGAGTCAAGCG-L8TX_171026_01_A05,2.6672168,13.780322 +10X_cells.CCCTCCTGTGGTCTCG-L8TX_171026_01_A05,3.1405716,12.223743 +10X_cells.CTCATTACACGGATAG-L8TX_171026_01_F05,3.004389,12.94447 +Smartseq_cells.SM-GE67S_S075_E1-50,4.789557,12.104021 +Smartseq_cells.SM-GE92I_S370_E1-50,3.0674899,13.138465 +10X_cells.CCGGTAGCAATGAAAC-L8TX_180406_01_B01,2.986528,9.622625 +10X_cells.TACTCGCCACCATCCT-L8TX_180406_01_B01,2.2739656,12.034472 +10X_cells.GCGCGATTCTTCGAGA-L8TX_180406_01_C01,2.640458,9.930972 +10X_cells.GGGCACTTCCCATTTA-L8TX_180406_01_C01,1.7598394,12.331245 +10X_cells.AACTCTTGTTATCGGT-L8TX_180406_01_F01,3.1952069,9.636781 +10X_cells.CCACCTATCGAACGGA-L8TX_180406_01_C02,2.8519301,10.017345 +10X_cells.CGCCAAGTCACCCGAG-L8TX_180406_01_C02,3.3804176,10.883977 +10X_cells.CGTTGGGCACCGTTGG-L8TX_180221_01_G10,2.108969,13.392891 +10X_cells.TCAGATGGTTCTGTTT-L8TX_180221_01_D10,0.92797583,13.215002 +10X_cells.TGCACCTCACGAAATA-L8TX_180221_01_D10,3.3374414,12.037822 +10X_cells.ACAGCCGCACGTTGGC-L8TX_180221_01_E10,2.3609374,13.719286 +10X_cells.TGGCGCAGTACATCCA-L8TX_180221_01_E10,3.1370363,11.6458 +10X_cells.ATCTGCCCACGAGGTA-L8TX_180221_01_G10,2.1157665,11.015578 +10X_cells.ACATCAGTCTCTAGGA-L8TX_180221_01_H10,2.2088125,13.076166 +10X_cells.GCATGTATCGAATGCT-L8TX_180221_01_H10,3.073443,12.81301 +10X_cells.CCTTTCTCAAAGGAAG-L8TX_180221_01_A11,1.6958444,12.47835 +10X_cells.CGCTATCGTCTTGTCC-L8TX_180926_01_C12,-0.49934062,13.62165 +10X_cells.GCGCGATCACATTTCT-L8TX_181012_01_B05,2.89687,10.521308 +10X_cells.AAAGTAGAGATGGGTC-L8TX_180221_01_B11,3.217427,12.91178 +10X_cells.GATGAGGGTACTCAAC-L8TX_180221_01_D11,2.6840777,12.218558 +10X_cells.CGTGTCTGTTCTGGTA-L8TX_180221_01_F11,1.7422689,14.592439 +10X_cells.GTCACGGCATCAGTCA-L8TX_180221_01_G11,0.09953086,11.135184 +10X_cells.CATGACAGTTTAGCTG-L8TX_180907_01_B12,2.48878,13.876835 +10X_cells.GCGCAACAGTACGTTC-L8TX_181011_01_B03,2.8742101,10.106085 +10X_cells.GTCCTCAAGACAGAGA-L8TX_180926_01_B01,2.4838908,12.128194 +10X_cells.GATGAGGAGAACTGTA-L8TX_180926_01_D01,3.1258307,12.20955 +10X_cells.CTCGGAGTCCCAAGAT-L8TX_181011_01_A03,1.136045,11.252544 +10X_cells.ATTTCTGGTAAAGGAG-L8TX_181011_01_B03,2.8605456,11.652497 +10X_cells.TGGCTGGTCTATCGCC-L8TX_181011_01_H03,1.0292537,15.168633 +10X_cells.GGTGCGTCAAGCGTAG-L8TX_180221_01_H11,3.3657238,12.586821 +10X_cells.GCTTGAACAATGGAAT-L8TX_180712_01_E05,2.4924228,12.480854 +10X_cells.CAGCAGCTCATCACCC-L8TX_180712_01_E05,1.7538755,13.034979 +10X_cells.CTTAACTGTTATGTGC-L8TX_180712_01_E05,3.0926259,9.648322 +10X_cells.CTGCTGTGTAAAGGAG-L8TX_180712_01_F05,2.772539,9.7699 +10X_cells.ATCCGAACAAGTCTGT-L8TX_180504_01_E01,0.16871342,10.67859 +10X_cells.CTTAGGAAGTTAGCGG-L8TX_180504_01_E01,2.8464975,10.471812 +10X_cells.GACCTGGCACGGCTAC-L8TX_180221_01_A12,6.3766975,9.875514 +10X_cells.CGAATGTGTAGCGTGA-L8TX_180221_01_B12,3.716182,10.469525 +10X_cells.GTCCTCAGTCAGAGGT-L8TX_180221_01_B12,3.2755089,9.698217 +10X_cells.CGTGAGCCAGTAAGCG-L8TX_180221_01_H11,-0.83503026,7.180014 +10X_cells.TGCCCTATCATGCATG-L8TX_180221_01_H11,0.4291031,10.59287 +10X_cells.GCAGCCAGTGTGAAAT-L8TX_180115_01_E11,1.0091192,13.987777 +10X_cells.TTCGAAGTCTTGTATC-L8TX_180115_01_B11,4.3710895,12.068848 +10X_cells.GTTCGGGCAATGAATG-L8TX_180115_01_C09,1.9645467,13.925391 +10X_cells.TGGCCAGAGCCGTCGT-L8TX_180115_01_A11,2.4036164,12.795006 +10X_cells.TGATTTCAGAGGACGG-L8TX_180115_01_H10,2.7525275,11.562334 +10X_cells.AAAGCAAGTCAACATC-L8TX_180115_01_B11,2.7540157,13.393431 +10X_cells.CTGCTGTAGACACTAA-L8TX_180115_01_B11,3.167854,12.179765 +10X_cells.TAGGCATAGAGTCTGG-L8TX_180115_01_B11,4.1048045,12.072863 +10X_cells.CGGAGCTTCTCCAGGG-L8TX_180115_01_D11,3.2105305,12.5222845 +10X_cells.ACACCAATCGGTGTTA-L8TX_180115_01_F10,2.3216474,13.076522 +10X_cells.GACCAATCACAGGCCT-L8TX_180115_01_E11,0.99847233,14.260294 +10X_cells.TGTTCCGGTGTCAATC-L8TX_180115_01_E11,0.65919757,14.464132 +10X_cells.CATGACAGTCATCCCT-L8TX_180115_01_F11,2.1786697,12.620337 +10X_cells.CGGAGTCAGGACGAAA-L8TX_180115_01_H11,2.6879091,12.486066 +10X_cells.GATGAAAAGAGGTTAT-L8TX_180115_01_H11,1.3658471,14.985914 +10X_cells.TACTTGTTCCAGAAGG-L8TX_180115_01_H11,1.2056386,14.088601 +10X_cells.CAAGGCCTCACTGGGC-L8TX_180115_01_G09,0.7105288,10.808202 +10X_cells.TGACTTTAGCAGCCTC-L8TX_180115_01_G09,-0.15302432,10.41999 +10X_cells.CTTACCGAGAGTCTGG-L8TX_171120_01_H07,3.650064,11.528035 +10X_cells.GGCTGGTCATCATCCC-L8TX_180115_01_G08,3.381779,12.094448 +10X_cells.CGCTATCAGGGATCTG-L8TX_180115_01_D08,3.364406,11.010027 +10X_cells.GGCTGGTGTCGAACAG-L8TX_180115_01_E08,3.6579807,12.495773 +Smartseq_cells.LS-15070_S44_E1-50,1.0394269,14.925665 +Smartseq_cells.LS-15075_S66_E1-50,2.786797,13.418782 +Smartseq_cells.LS-15542_S74_E1-50,1.9607989,14.409757 +Smartseq_cells.LS-15577_S57_E1-50,-1.8319539,1.6905797 +Smartseq_cells.SM-D9E4J_S47_E1-50,4.0358458,10.976556 +Smartseq_cells.SM-D9E4K_S04_E1-50,0.3654255,15.184332 +Smartseq_cells.SM-D9E62_S73_E1-50,-3.0301554,-1.6588054 +Smartseq_cells.SM-GE67T_S290_E1-50,3.1988993,12.818161 +Smartseq_cells.SM-GE67T_S305_E1-50,1.2140559,14.920056 +Smartseq_cells.SM-GE92Z_S315_E1-50,3.268684,12.828308 +10X_cells.AAATGCCAGTAGATGT-L8TX_180221_01_A10,-2.1135857,11.820622 +10X_cells.ATCCGAATCGAATCCA-L8TX_180221_01_A10,-0.5183009,10.59832 +10X_cells.CACATTTAGTCAAGGC-L8TX_180221_01_B10,-1.8336047,12.977708 +10X_cells.TACAGTGCATAGAAAC-L8TX_180221_01_B10,-1.7487844,13.384294 +10X_cells.AAGGTTCTCGCAAACT-L8TX_180221_01_C10,4.7159824,12.1279745 +10X_cells.AGCTCTCGTACATGTC-L8TX_180221_01_C10,-1.2820089,12.73947 +10X_cells.CGTGTAACAAGAGTCG-L8TX_180221_01_C10,-1.3011584,12.605958 +10X_cells.GGACAGACATCCCATC-L8TX_180221_01_C10,-1.7811805,12.952782 +10X_cells.GTACTTTTCACAGGCC-L8TX_180406_01_C06,-1.0736655,12.302089 +10X_cells.AACTCCCAGTCTCGGC-L8TX_180221_01_D09,-2.0745318,13.9289255 +10X_cells.CCTTACGCAGATCGGA-L8TX_180221_01_D09,-0.6883852,11.049632 +10X_cells.CACCTTGAGATGTTAG-L8TX_180712_01_B06,-1.6764864,13.283992 +Smartseq_cells.LS-15087_S33_E1-50,3.9950128,12.422351 +Smartseq_cells.LS-15339_S62_E1-50,-1.8609309,15.520833 +Smartseq_cells.LS-15524_S90_E1-50,-1.3131272,14.870971 +Smartseq_cells.LS-15577_S10_E1-50,0.84881186,13.432885 +Smartseq_cells.SM-D9EPG_S40_E1-50,-1.4010551,14.726517 +Smartseq_cells.SM-D9EPG_S63_E1-50,-1.8468821,14.718093 +Smartseq_cells.SM-D9EPG_S67_E1-50,-1.8753353,15.446416 +10X_cells.TAGTTGGTCGTTTAGG-L8TX_180829_01_D09,-0.5134488,10.792016 +10X_cells.CTGCGGACATCTGGTA-L8TX_180829_01_D10,-1.1044259,10.831402 +10X_cells.GCTCCTATCCGCGTTT-L8TX_181011_01_G02,-1.094487,12.298703 +10X_cells.CTAATGGCATTATCTC-L8TX_181012_01_E05,4.048735,9.180558 +10X_cells.TCAGATGCAAGCTGGA-L8TX_181012_01_E05,-0.6648032,11.387228 +10X_cells.TGACTTTCAAACGCGA-L8TX_180406_01_E02,-1.7449411,14.523217 +10X_cells.AGGGATGCAATGGAAT-L8TX_180406_01_G02,0.22387591,9.192335 +Smartseq_cells.SM-GE5VC_S288_E1-50,-0.34000933,13.565841 +10X_cells.AGAATAGAGAGTAATC-L8TX_171026_01_F03,-2.1707087,14.100247 +10X_cells.CGCTATCCATTGGGCC-L8TX_171026_01_F03,-0.9431133,12.58915 +10X_cells.GTTTCTAGTGTAATGA-L8TX_171026_01_F03,-1.569473,12.408375 +10X_cells.GATCGCGCATTGGCGC-L8TX_171026_01_G03,-2.18292,15.256794 +10X_cells.TAGGCATTCTCATTCA-L8TX_171026_01_G03,-1.9463558,13.416075 +10X_cells.CTTACCGTCAAGGTAA-L8TX_171026_01_B04,-1.0884897,14.094555 +10X_cells.CGTCAGGAGACAGGCT-L8TX_171026_01_G04,-2.4807618,15.412341 +10X_cells.CTTACCGTCTTGCCGT-L8TX_171026_01_H04,-1.7824715,14.80566 +10X_cells.TCCACACGTCCGCTGA-L8TX_171026_01_H04,-1.893242,13.646466 +10X_cells.TGAGGGATCGCCTGAG-L8TX_171026_01_A05,-1.9852992,15.200921 +10X_cells.ACCTTTATCCTAAGTG-L8TX_171026_01_H03,-2.4740858,15.004516 +10X_cells.CTCTGGTAGCGCCTTG-L8TX_171026_01_H03,-1.6932094,13.347643 +10X_cells.TTAGGACTCTAACCGA-L8TX_171026_01_H03,-1.7112547,13.122109 +10X_cells.CGACTTCGTGCAGACA-L8TX_171026_01_A04,-2.1530013,13.512703 +10X_cells.ACACCAACACAGGTTT-L8TX_171026_01_C05,-1.7213016,13.296123 +10X_cells.AAAGATGGTGAAAGAG-L8TX_171026_01_E05,-2.410851,14.561031 +10X_cells.GCCAAATTCGACGGAA-L8TX_171026_01_E05,-3.1184466,11.939338 +10X_cells.CGCGTTTGTCTGATCA-L8TX_171026_01_F05,-2.4418962,15.129314 +10X_cells.GACGCGTTCACTTACT-L8TX_171026_01_F05,-2.3267066,13.215709 +10X_cells.TCATTTGAGAGCCCAA-L8TX_171026_01_F05,-1.3394672,11.141824 +10X_cells.CTCACACAGAAACCAT-L8TX_171026_01_G05,-1.4928534,13.282879 +10X_cells.GATCGATCAGGGATTG-L8TX_171026_01_G05,-2.0840173,13.522408 +10X_cells.GTAACGTGTGTGGTTT-L8TX_171026_01_H05,-2.3756115,14.959836 +Smartseq_cells.SM-GE67S_S062_E1-50,-1.5950241,15.247661 +Smartseq_cells.SM-GE92L_S186_E1-50,-1.3991581,15.051084 +Smartseq_cells.SM-GE92L_S247_E1-50,-2.184215,15.611919 +Smartseq_cells.SM-GE92L_S279_E1-50,-1.8422452,15.115285 +Smartseq_cells.SM-GE92L_S337_E1-50,-2.2271585,15.898792 +10X_cells.ACTTTCACAGGTCCAC-L8TX_181206_01_H11,4.7103763,12.332052 +10X_cells.ACGCCGATCAATAAGG-L8TX_181206_01_A12,-0.93082416,11.210168 +Smartseq_cells.SM-GE914_S119_E1-50,-2.2619436,15.775973 +Smartseq_cells.SM-GE914_S145_E1-50,-2.311186,15.412748 +10X_cells.ATCCACCAGTAGATGT-L8TX_180406_01_B01,2.1323013,9.480074 +10X_cells.GCATGTACACCCATGG-L8TX_180406_01_B01,-2.955639,8.300586 +10X_cells.GCTGCTTCACACGCTG-L8TX_180406_01_B01,-2.2495165,11.026489 +10X_cells.AACTCTTGTAGCTGCC-L8TX_180406_01_C01,-1.1045874,10.471642 +10X_cells.GGAGCAATCGGACAAG-L8TX_180406_01_D01,2.8212016,9.296435 +10X_cells.TTAGGCATCGAATCCA-L8TX_180406_01_D01,-0.42009914,10.561184 +10X_cells.GTGCATAAGACGCTTT-L8TX_180406_01_F01,-1.7650527,13.676443 +10X_cells.GGAGCAAAGTGACTCT-L8TX_180406_01_G01,0.9865674,10.140302 +10X_cells.AAAGCAAAGTTAGCGG-L8TX_180406_01_B02,-0.013806543,8.375644 +10X_cells.CTGAAACTCTCACATT-L8TX_180406_01_B02,-1.4543248,11.218309 +10X_cells.AGATTGCCACGTGAGA-L8TX_180406_01_C02,-1.4001293,10.852803 +10X_cells.ACGTCAAGTTGGACCC-L8TX_180406_01_D02,-1.0771979,10.592967 +10X_cells.TGAGGGAGTTACGTCA-L8TX_180221_01_G10,-1.448686,14.251364 +10X_cells.TAGAGCTGTTAGTGGG-L8TX_180221_01_D10,0.23040968,8.82535 +10X_cells.TGATTTCCATCACGTA-L8TX_180221_01_D10,-1.0257336,12.384627 +10X_cells.GTGTTAGTCGAGCCCA-L8TX_180221_01_E10,-1.2115347,14.156234 +10X_cells.CTAGCCTTCTTCTGGC-L8TX_180221_01_A11,-1.8445866,14.742814 +10X_cells.GTACTTTCATTCGACA-L8TX_190312_01_D02,0.15349613,10.095504 +10X_cells.CTTTGCGGTCGAACAG-L8TX_190312_01_G02,-0.21520354,8.833387 +10X_cells.AGCTCTCTCACGCGGT-L8TX_180221_01_D11,-0.4122565,9.675917 +10X_cells.GGACGTCGTTCGTGAT-L8TX_180221_01_E11,-1.707118,12.0723095 +10X_cells.ACTTGTTGTACTTAGC-L8TX_180221_01_G11,-0.8039282,11.289705 +Smartseq_cells.SM-GE67O_S061_E1-50,-0.84876096,14.700552 +10X_cells.CGATTGAAGCAATATG-L8TX_180907_01_B12,4.348929,9.389851 +Smartseq_cells.SM-GE5US_S010_E1-50,-1.651815,14.595803 +10X_cells.TGCACCTTCGTTTATC-L8TX_180926_01_B01,0.2090709,12.95657 +10X_cells.TGACAACTCATATCGG-L8TX_180926_01_D01,-0.22568907,10.206758 +10X_cells.GACCAATCATAACCTG-L8TX_181011_01_C03,-3.1061606,11.950979 +10X_cells.GCAGCCACAGTGGAGT-L8TX_181011_01_H03,-1.0023308,11.368519 +10X_cells.TCCACACGTAAGTTCC-L8TX_181011_01_H03,0.4948293,11.120896 +Smartseq_cells.SM-GE914_S074_E1-50,-1.0351856,14.483271 +Smartseq_cells.SM-GE914_S365_E1-50,-0.4498776,14.163499 +10X_cells.CGGACACGTTCCAACA-L8TX_200611_02_A05,-0.99152434,13.792044 +10X_cells.GCACATAAGTGGACGT-L8TX_180712_01_E05,-0.86589533,13.005447 +10X_cells.TTTACTGGTCATCGGC-L8TX_180712_01_F05,0.26517048,10.400227 +10X_cells.ATAAGAGTCAACACAC-L8TX_180712_01_H05,1.9125704,9.1719265 +10X_cells.ATGGGAGTCATTTGGG-L8TX_180712_01_H05,-0.41062802,11.535879 +10X_cells.ATTTCTGAGCGGCTTC-L8TX_180712_01_H05,1.9316416,9.25994 +10X_cells.GCGACCACAATTCCTT-L8TX_180712_01_H05,-1.2214936,12.766076 +10X_cells.ATCATCTCAGACGTAG-L8TX_180712_01_A06,-0.40290427,12.802397 +10X_cells.GTCAAGTGTCAATACC-L8TX_180712_01_A06,1.6775258,9.627565 +10X_cells.TTCTCAAGTAGGCTGA-L8TX_180712_01_A06,-0.8586603,12.723691 +10X_cells.AACTTTCAGACTGGGT-L8TX_180504_01_E01,-1.3372763,11.842526 +10X_cells.ATCACGAAGCAATCTC-L8TX_180221_01_B12,2.3967144,10.322288 +10X_cells.CAGATCACACACCGAC-L8TX_180221_01_B12,0.17217875,9.088922 +10X_cells.TGCTACCTCGAATCCA-L8TX_180221_01_B12,-0.550519,10.367816 +10X_cells.CAGAGAGAGCTAGTTC-L8TX_200611_02_A05,1.1051158,9.91858 +10X_cells.CCACGGACAGTTCATG-L8TX_200611_02_A05,-0.242939,12.060538 +10X_cells.GTGCTTCGTAAACCTC-L8TX_200611_02_A05,0.86380905,9.349794 +10X_cells.CAGAGAGAGCCAACAG-L8TX_180115_01_D11,-1.5602385,10.700386 +10X_cells.GAGCAGACATCGTCGG-L8TX_180115_01_A09,-0.92534184,9.718467 +10X_cells.GATGAGGCAAGGTTCT-L8TX_180115_01_B09,-1.4624101,11.657893 +10X_cells.TGGCGCACAAGCCATT-L8TX_180115_01_B09,-0.9239152,10.253036 +10X_cells.ATCGAGTGTAGTACCT-L8TX_180115_01_C09,-1.9560947,11.706175 +10X_cells.TCGTACCAGCGATCCC-L8TX_180115_01_C09,-2.9136274,11.088102 +10X_cells.GACCAATCAAGTTAAG-L8TX_180115_01_D09,-0.665165,10.34187 +10X_cells.GGAATAACAGCTGTAT-L8TX_180115_01_D09,-1.2187631,10.649097 +10X_cells.ACGATACCAGGCAGTA-L8TX_180115_01_A11,-1.2450763,11.495661 +10X_cells.ATTACTCGTGCACCAC-L8TX_180115_01_A11,-1.0020317,12.517225 +10X_cells.CTCAGAACATATGCTG-L8TX_180115_01_A11,2.4154046,11.927711 +10X_cells.CTGCCTATCACTCTTA-L8TX_180115_01_H10,-0.9777457,10.502009 +10X_cells.CAACCTCAGAGAACAG-L8TX_180115_01_B11,-2.6421506,15.413607 +10X_cells.CTGTTTAGTCTGCGGT-L8TX_180115_01_B11,-2.100026,12.748619 +10X_cells.TGTGGTAGTACAGACG-L8TX_180115_01_C10,-1.231846,11.296793 +10X_cells.ACATCAGAGAGATGAG-L8TX_180115_01_D11,-0.2882988,9.662684 +10X_cells.AGAATAGTCTTGACGA-L8TX_180115_01_D11,-0.92793334,11.700766 +10X_cells.AGAGTGGTCCACTGGG-L8TX_180115_01_D11,-1.5525208,12.196349 +10X_cells.CATCAAGTCATAACCG-L8TX_180115_01_D11,-1.0534402,13.207797 +10X_cells.CCATTCGTCATCGGAT-L8TX_180115_01_D11,-1.9162159,11.17851 +10X_cells.CTGATAGAGACTGGGT-L8TX_180115_01_D11,-1.6953237,12.901006 +10X_cells.GCATACATCGTTTAGG-L8TX_180115_01_D11,-0.97272235,11.263151 +10X_cells.GGGCATCAGTTTGCGT-L8TX_180115_01_D11,-1.3322223,11.377641 +10X_cells.TGTGGTAGTGATGCCC-L8TX_180115_01_D11,-1.3052036,13.588172 +10X_cells.GTGAAGGAGGCTAGGT-L8TX_180115_01_E10,-1.9156473,11.666363 +10X_cells.TGAGCCGAGAGCTGCA-L8TX_180115_01_E10,-2.5653348,15.347855 +10X_cells.TGGTTAGAGTAAGTAC-L8TX_180115_01_E10,-0.3475274,10.186974 +10X_cells.TTTACTGGTCCGTGAC-L8TX_180115_01_E10,-0.5927945,11.300049 +10X_cells.TGAAAGATCCGCATAA-L8TX_180115_01_F10,-0.6858794,9.814494 +10X_cells.AGATTGCGTTATGTGC-L8TX_180115_01_G10,-1.4676362,11.48253 +10X_cells.AAATGCCCAGGGAGAG-L8TX_180115_01_E11,-2.8274677,11.700213 +10X_cells.AGATCTGGTAATCGTC-L8TX_180115_01_F11,-0.90793794,11.64326 +10X_cells.ATCATCTAGGTGCACA-L8TX_180115_01_F11,-1.5346539,11.668574 +10X_cells.CACATTTAGAAGGCCT-L8TX_180115_01_F11,-1.5140129,13.180732 +10X_cells.CGTCACTAGATCCCAT-L8TX_180115_01_F11,-0.62214535,11.524211 +10X_cells.GACCTGGTCGGTGTTA-L8TX_180115_01_F11,-1.716775,12.833771 +10X_cells.TACAGTGTCCCTTGTG-L8TX_180115_01_F11,-1.8752791,15.080506 +10X_cells.TACGGATAGGTAGCCA-L8TX_180115_01_F11,-1.5295969,12.606738 +10X_cells.TGGCTGGAGTCCATAC-L8TX_180115_01_F11,-3.0198963,11.116026 +10X_cells.ACCAGTAAGAGTGAGA-L8TX_180115_01_G11,-1.7566804,12.650031 +10X_cells.AGCGTCGCAAGTAGTA-L8TX_180115_01_G11,-1.1350945,11.799731 +10X_cells.AGGCCACTCATACGGT-L8TX_180115_01_G11,-1.9262509,12.111846 +10X_cells.TCGGTAAGTGTGACCC-L8TX_180115_01_G11,-1.7401867,12.7602625 +10X_cells.TGCTACCGTTGCGCAC-L8TX_180115_01_G11,-0.8790966,11.908361 +10X_cells.AAACGGGAGTAGCGGT-L8TX_180115_01_H11,3.4766102,11.430057 +10X_cells.CTGATCCCATCGATGT-L8TX_180115_01_H11,-0.40975395,10.717101 +10X_cells.TCATTACGTTAAGATG-L8TX_180115_01_H11,-0.9130512,11.410568 +10X_cells.GATCGATTCAACACTG-L8TX_180115_01_H09,-1.065314,10.871064 +10X_cells.TTAACTCAGCCACTAT-L8TX_180115_01_H09,-0.6154646,9.916096 +10X_cells.GTTCGGGGTCAGAATA-L8TX_180115_01_E09,-1.063294,12.837192 +10X_cells.CGGGTCAGTCGGCATC-L8TX_171120_01_G07,-1.441427,12.108829 +10X_cells.TTCTCAAGTAGTGAAT-L8TX_171120_01_G07,-0.7918084,13.011644 +10X_cells.CCCATACGTTAGAACA-L8TX_171120_01_H07,-0.45736918,11.866538 +10X_cells.GCAATCATCTAAGCCA-L8TX_171120_01_H07,0.77679324,8.73781 +10X_cells.ACTTACTGTTCAACCA-L8TX_171120_01_C07,-1.6771929,12.878584 +10X_cells.CTAACTTCAATAGCAA-L8TX_171120_01_C07,-2.0032642,15.209555 +10X_cells.CACACAAGTATTAGCC-L8TX_180115_01_H08,-1.046019,11.51739 +10X_cells.CTACCCAAGCTAAGAT-L8TX_180115_01_H08,-1.0055095,12.134907 +10X_cells.AAATGCCTCTGTACGA-L8TX_171120_01_E07,-3.0848837,7.9922833 +10X_cells.TGACTTTGTACTCGCG-L8TX_171120_01_F07,-2.175572,10.889114 +10X_cells.TGGACGCAGAGGTACC-L8TX_171120_01_F07,-1.9247645,12.180085 +10X_cells.CTTACCGCACAGGAGT-L8TX_180115_01_F08,-0.36568555,14.267685 +10X_cells.TCAACGAGTCAGCTAT-L8TX_180115_01_F08,-2.7437668,15.456772 +10X_cells.GTGCATATCCCAAGAT-L8TX_180115_01_E08,-1.1228822,11.414284 +Smartseq_cells.LS-15061_S72_E1-50,-1.9767171,15.8209715 +Smartseq_cells.LS-15338_S92_E1-50,-2.1333146,15.854229 +Smartseq_cells.LS-15350_S64_E1-50,-2.1886926,15.849835 +Smartseq_cells.LS-15396_S93_E1-50,-1.9578041,15.9282055 +Smartseq_cells.SM-D9D8K_S90_E1-50,-0.09866971,14.251563 +Smartseq_cells.SM-GE67S_S003_E1-50,-0.7614964,14.474995 +Smartseq_cells.SM-GE67S_S005_E1-50,-1.304368,13.187647 +Smartseq_cells.SM-GE67S_S014_E1-50,-2.0842063,15.900581 +Smartseq_cells.SM-GE92Z_S320_E1-50,0.30903596,13.533135 +Smartseq_cells.SM-GE94L_S045_E1-50,-1.9022657,15.184523 +Smartseq_cells.SM-GE5VT_S051_E1-50,-0.15714401,14.345539 +Smartseq_cells.SM-GE5VT_S065_E1-50,-2.2033737,15.885817 +Smartseq_cells.SM-GE5VT_S072_E1-50,-1.9597907,15.863345 +10X_cells.CACATAGGTCGATTGT-L8TX_180829_01_D09,-6.4553385,9.328259 +10X_cells.TCGAGGCCACGAAACG-L8TX_180829_01_D09,-7.5638213,9.314345 +10X_cells.GGCCGATCAATGAATG-L8TX_181011_01_G02,-6.2510962,9.411607 +10X_cells.TGTGTTTTCTGCAAGT-L8TX_181012_01_H04,-3.9377396,11.43284 +10X_cells.ACCGTAACACGTCTCT-L8TX_180406_01_E06,0.5823825,7.2707753 +10X_cells.GGCAATTAGACCTTTG-L8TX_171026_01_H03,8.644872,16.544186 +10X_cells.ACTGCTCAGCTAAGAT-L8TX_171026_01_B04,-8.030812,11.367273 +10X_cells.TGCGCAGCAAGTCATC-L8TX_171026_01_B04,-8.0741415,11.461708 +10X_cells.GCATACATCGCCCTTA-L8TX_171026_01_H03,-6.8140864,10.20057 +10X_cells.GCAATCAAGTGTTAGA-L8TX_180926_01_C12,-6.351112,9.714505 +10X_cells.GAGGTGACAAGCGAGT-L8TX_180926_01_D01,-7.241304,10.4373665 +10X_cells.AGACGTTCACAAGACG-L8TX_180712_01_H05,-7.1509213,8.886346 +10X_cells.GTTAAGCTCCAGTAGT-L8TX_180115_01_A10,-3.9584136,8.148679 +10X_cells.CACATTTCAAACCCAT-L8TX_180115_01_H10,-3.653553,10.169259 +10X_cells.GTTACAGCATGAGCGA-L8TX_180115_01_B09,-5.559006,9.016619 +10X_cells.AACTCCCTCACGCATA-L8TX_180115_01_E10,-4.1580305,11.891541 +10X_cells.TTGCCGTAGAAGGTGA-L8TX_180115_01_E09,-5.492594,8.881073 +10X_cells.CGCGGTATCCCACTTG-L8TX_180115_01_B10,-4.257543,10.815774 +10X_cells.GGGAATGTCGGCTACG-L8TX_180115_01_H11,-1.8397056,7.175928 +10X_cells.GGTGTTATCTTAACCT-L8TX_180115_01_D10,-5.7061315,8.963756 +10X_cells.GCGGGTTCACAGAGGT-L8TX_180115_01_G10,-3.3346608,7.587505 +10X_cells.CCGGGATGTAGGCTGA-L8TX_180115_01_B09,-7.934633,10.115928 +10X_cells.ATTATCCAGATTACCC-L8TX_180115_01_E09,-7.3808413,9.230829 +10X_cells.GCATGCGAGCTAACAA-L8TX_180115_01_H11,-7.034507,11.048071 +10X_cells.GCAAACTTCGGATGGA-L8TX_180115_01_G09,-3.3246841,7.9093604 +10X_cells.GTGTTAGTCCCATTTA-L8TX_180115_01_C09,-5.1584897,8.697234 +10X_cells.AGTAGTCGTTGTCTTT-L8TX_180115_01_C11,-6.7480454,9.268923 +10X_cells.TCGCGAGAGGGTCGAT-L8TX_180115_01_A11,-6.9204297,10.329933 +10X_cells.CCTTACGAGTTAAGTG-L8TX_180115_01_C09,-7.728895,10.419018 +10X_cells.TACACGAAGCAGGCTA-L8TX_180115_01_E09,-5.059143,8.564611 +10X_cells.GATGCTATCCTTGCCA-L8TX_180115_01_G11,-6.4334774,10.388285 +10X_cells.CTCGTACGTCGATTGT-L8TX_180115_01_F10,-6.5926204,9.675501 +10X_cells.CTGGTCTTCCCTAATT-L8TX_180115_01_C09,-7.2651896,9.539665 +10X_cells.CTTCTCTGTCGCTTTC-L8TX_180115_01_H10,-5.8620696,9.046471 +10X_cells.CCTTACGTCGTAGGTT-L8TX_180115_01_A11,-7.082693,9.665325 +10X_cells.GTCACAAGTCGACTGC-L8TX_180115_01_B11,-7.9660287,11.398444 +10X_cells.TGCCCTAAGATCCGAG-L8TX_180115_01_A11,-4.46174,8.060196 +10X_cells.CATCGGGGTTGTACAC-L8TX_180115_01_E11,-4.6447024,10.086154 +10X_cells.TCGTACCTCCAGAAGG-L8TX_180115_01_C09,-7.064025,9.645921 +10X_cells.ACTTACTAGAGTAAGG-L8TX_180115_01_H10,-7.4099164,9.226343 +10X_cells.GACTACACACCACCAG-L8TX_180115_01_D11,-6.4124746,9.696521 +10X_cells.TCCCGATTCAGGTAAA-L8TX_180115_01_G11,-5.3338366,8.22924 +10X_cells.CGTCAGGGTAATAGCA-L8TX_180115_01_E11,-4.7119694,7.403528 +10X_cells.TCCCGATTCTCCTATA-L8TX_180115_01_B09,-8.009548,10.030605 +10X_cells.CGTCACTCAGGGCATA-L8TX_180115_01_E10,-4.273215,11.725547 +10X_cells.GTCCTCATCTCCCTGA-L8TX_180115_01_D09,-7.4973207,9.582941 +10X_cells.AGCTTGAAGCCATCGC-L8TX_180115_01_C09,-7.4266205,9.556988 +10X_cells.TAAGCGTAGGTAGCTG-L8TX_180115_01_G11,-3.6319373,7.0743465 +10X_cells.AAAGCAATCACCGTAA-L8TX_180115_01_A10,-4.6076636,8.763746 +10X_cells.ATTGGTGCAGTAGAGC-L8TX_180115_01_E10,-7.218921,9.163496 +10X_cells.CAGCGACGTCTGCAAT-L8TX_180115_01_B09,-5.811716,9.08665 +10X_cells.AAACGGGTCAGTGTTG-L8TX_180115_01_H11,-4.8210983,7.6369004 +10X_cells.TCGTACCTCACCTCGT-L8TX_180115_01_C09,-6.682886,10.113828 +10X_cells.TGCACCTGTAAATGAC-L8TX_180115_01_A11,-5.9432073,9.862988 +10X_cells.TACCTATCAAGTAGTA-L8TX_180115_01_C09,-5.4825525,8.284737 +10X_cells.CGCGGTAGTACTTAGC-L8TX_180115_01_D10,-5.7199464,9.009909 +10X_cells.GATGAGGAGGAGTACC-L8TX_180115_01_H09,-4.318018,8.445129 +10X_cells.CCATTCGCAATCCAAC-L8TX_180115_01_G10,-3.982472,8.36434 +10X_cells.TCCCGATTCTAACTGG-L8TX_180115_01_H10,-5.6655526,7.870482 +10X_cells.CACAAACAGACGCTTT-L8TX_180115_01_B11,-6.9581494,13.06187 +10X_cells.TGAGCATGTCATACTG-L8TX_180115_01_F10,-8.034467,10.647615 +10X_cells.CAGCTGGTCAAGGCTT-L8TX_180115_01_F09,-5.9067235,9.060385 +10X_cells.GTAGGCCTCAGCTCGG-L8TX_180115_01_F09,-4.8886404,8.803371 +10X_cells.CCTTACGTCGCATGAT-L8TX_180115_01_E09,-6.9093437,8.979541 +10X_cells.AAGCCGCTCTTGTTTG-L8TX_180115_01_G11,-6.963542,9.542437 +10X_cells.CACAGGCAGTGTTGAA-L8TX_180115_01_G09,-1.841853,7.4570427 +10X_cells.TGGACGCGTCAGATAA-L8TX_180115_01_F10,-8.1762905,10.63831 +10X_cells.CAGGTGCGTTCAGTAC-L8TX_171120_01_H07,-7.72194,9.179182 +10X_cells.GTAACTGTCCATGCTC-L8TX_171120_01_H07,-7.28062,9.138634 +10X_cells.CCTAAAGGTCACAAGG-L8TX_180115_01_G08,-8.070403,10.752503 +10X_cells.CTAATGGAGAGGTTGC-L8TX_171120_01_C07,-1.5966489,7.1897473 +10X_cells.TGGGAAGGTCATTAGC-L8TX_180115_01_H08,-5.919892,9.574213 +10X_cells.GCTCTGTGTCTAGTGT-L8TX_180115_01_D08,-4.8192215,8.691713 +10X_cells.AAGGAGCGTGTTTGTG-L8TX_171120_01_D07,-7.6621995,10.831568 +10X_cells.GCTTCCATCACCGGGT-L8TX_171120_01_D07,-6.321151,8.410755 +10X_cells.TCTTCGGTCCTAGTGA-L8TX_171120_01_D07,-5.6700444,7.532193 +10X_cells.AGGGAGTGTGTAATGA-L8TX_171120_01_E07,-7.0735846,10.452796 +10X_cells.CCGGTAGCACTTGGAT-L8TX_171120_01_E07,-4.0839562,8.222409 +10X_cells.CTCTACGAGGATGTAT-L8TX_171120_01_E07,-7.946608,11.381776 +10X_cells.GCTCTGTCACTTCTGC-L8TX_171120_01_E07,-5.722003,8.395561 +Smartseq_cells.LS-15009_S83_E1-50,-7.976962,9.150223 +Smartseq_cells.LS-15061_S80_E1-50,-8.120288,10.640407 +Smartseq_cells.LS-15354_S92_E1-50,-8.198266,10.329934 +Smartseq_cells.LS-15363_S82_E1-50,-8.0248165,9.298903 +Smartseq_cells.LS-15513_S27_E1-50,-8.011348,11.482396 +Smartseq_cells.LS-15514_S09_E1-50,-8.275403,10.298523 +Smartseq_cells.LS-15514_S11_E1-50,-7.905943,9.0988 +Smartseq_cells.SM-D9E5X_S59_E1-50,-8.254091,10.717701 +Smartseq_cells.SM-D9E61_S84_E1-50,-8.123882,9.850538 +Smartseq_cells.SM-GE64U_S035_E1-50,-7.696987,9.468376 +Smartseq_cells.SM-GE65Z_S123_E1-50,-7.529214,9.071225 +Smartseq_cells.SM-GE65Z_S125_E1-50,-8.2760515,10.226225 +Smartseq_cells.SM-GE65Z_S152_E1-50,-8.218622,10.805663 +Smartseq_cells.SM-GE65Z_S162_E1-50,-8.229683,10.535077 +10X_cells.AAGTCTGCACCAGGCT-L8TX_180221_01_F09,-3.1843734,12.254735 +10X_cells.ATAACGCTCCATGCTC-L8TX_180221_01_F09,-0.63192326,8.497725 +10X_cells.CCGGTAGCAAGTAATG-L8TX_180221_01_F09,-2.1027014,12.743985 +10X_cells.CGTGTCTAGTCAAGCG-L8TX_180221_01_F09,-0.64343125,11.853161 +10X_cells.CTCGAAACACGAAATA-L8TX_180221_01_F09,-0.7974663,6.44762 +10X_cells.AACTCTTCACCGTTGG-L8TX_180221_01_G09,2.6188579,7.3386507 +10X_cells.AGGCCACAGCTGCGAA-L8TX_180221_01_G09,-0.5980832,6.4076104 +10X_cells.GGCTCGAAGCTAAGAT-L8TX_180221_01_H09,-6.3592544,8.911296 +10X_cells.TGCCCATCAACTTGAC-L8TX_180221_01_H09,-2.7900867,8.127796 +10X_cells.CATCGGGTCAGGTAAA-L8TX_180221_01_A10,0.21765499,7.2012315 +10X_cells.CGTCTACCAAGCTGTT-L8TX_180221_01_A10,-5.6134415,11.355847 +10X_cells.GAAGCAGGTCTTCGTC-L8TX_180221_01_A10,-4.76641,7.8428535 +10X_cells.GCGCAGTAGGAGTAGA-L8TX_180221_01_A10,-2.2695525,6.7698593 +10X_cells.CATATTCCATCAGTAC-L8TX_180221_01_B10,-0.5858468,6.535203 +10X_cells.CTCCTAGGTAAGGGCT-L8TX_180221_01_B10,-6.9231653,8.381887 +10X_cells.GAATAAGTCGCCATAA-L8TX_180221_01_B10,-5.9845705,7.838829 +10X_cells.GAGGTGAGTTGAGGTG-L8TX_180221_01_B10,-4.4299264,6.2616987 +10X_cells.AGCGTATCATCCTAGA-L8TX_180221_01_C10,-7.065848,10.823792 +10X_cells.AGGCCGTAGACAAGCC-L8TX_180221_01_C10,-4.5342865,7.015748 +10X_cells.CATCAGACACCATCCT-L8TX_180406_01_F02,-0.45145437,7.46694 +10X_cells.CCATGTCGTACGAAAT-L8TX_180406_01_F02,-1.829651,7.1279707 +10X_cells.GGATTACAGGGCATGT-L8TX_180406_01_F02,0.5659611,6.4094872 +10X_cells.ACTTTCACAAACTGTC-L8TX_180406_01_C06,1.7690383,6.7065506 +10X_cells.ATTATCCGTCCGCTGA-L8TX_180406_01_C06,-2.2987602,7.2015014 +10X_cells.CAGCGACTCGCAAGCC-L8TX_180406_01_C06,-2.0868013,14.63509 +10X_cells.CTAGTGAAGGCTAGAC-L8TX_180406_01_C06,-5.5245237,8.110263 +10X_cells.GACCAATTCTGATTCT-L8TX_180406_01_C06,-0.7918676,7.192923 +10X_cells.GGCTGGTGTGTTTGTG-L8TX_180406_01_C06,-2.526708,7.6460094 +Smartseq_cells.SM-DD45T_S048_E1-50,3.2925723,6.761093 +Smartseq_cells.SM-DD45T_S172_E1-50,5.217739,5.491794 +Smartseq_cells.SM-GE63L_S332_E1-50,-5.774918,7.679718 +Smartseq_cells.SM-GE67T_S162_E1-50,-5.383236,7.0628223 +Smartseq_cells.SM-GE67T_S251_E1-50,-7.009539,8.136924 +10X_cells.ATTACTCTCAACCATG-L8TX_180221_01_H12,-3.1324298,11.342973 +10X_cells.CACACTCCATAAAGGT-L8TX_180221_01_H12,-2.7195485,7.630308 +10X_cells.TACCTATAGGGCTTGA-L8TX_180221_01_H12,-3.8734012,7.3471994 +10X_cells.CGTTCTGAGACTAGGC-L8TX_180221_01_E09,-4.7658753,6.7725205 +10X_cells.CATCAGATCTAACTGG-L8TX_180221_01_C09,-4.240837,6.8890452 +10X_cells.CGTCACTAGCCGGTAA-L8TX_180221_01_C09,-3.7928553,8.174965 +10X_cells.TCACGAACAAGGACAC-L8TX_180221_01_C09,1.8209485,6.469101 +10X_cells.AATCGGTGTCCAACTA-L8TX_180221_01_D09,1.5899733,6.7370744 +10X_cells.ACACCAAGTTTAGGAA-L8TX_180221_01_D09,-2.9557605,10.445411 +10X_cells.ATCTACTAGATGAGAG-L8TX_180221_01_D09,-4.014505,9.171597 +10X_cells.CGGACGTAGTGTGGCA-L8TX_180221_01_D09,-3.9143817,7.84082 +10X_cells.GAAATGAGTGACTCAT-L8TX_180221_01_D09,-3.9679086,8.421412 +10X_cells.GGTGAAGTCAGCTGGC-L8TX_180221_01_D09,-1.6456801,6.78978 +10X_cells.TGTTCCGTCACCCGAG-L8TX_180221_01_D09,-0.350447,7.5483413 +10X_cells.CAACCAAGTACCGTAT-L8TX_180607_01_C05,-3.281243,7.2084985 +10X_cells.CGAGCCATCTGGCGAC-L8TX_180607_01_C05,-5.77441,9.645396 +10X_cells.GCATGCGCAATGTTGC-L8TX_180607_01_C05,-3.0438426,9.026065 +10X_cells.GCGCAACCAGATGGGT-L8TX_180607_01_C05,-2.471266,8.4448185 +10X_cells.GGAATAAAGCCCTAAT-L8TX_180607_01_C05,-3.8645515,8.840854 +10X_cells.GGTATTGGTTACGACT-L8TX_180607_01_C05,-5.0822463,10.834196 +10X_cells.CGTTAGAGTGCGAAAC-L8TX_180712_01_G05,-3.523343,8.391558 +10X_cells.CTGATCCCAACACGCC-L8TX_180712_01_G05,-5.910404,10.009285 +10X_cells.TAGGCATTCTGCGGCA-L8TX_180712_01_G05,-4.4474316,6.4977965 +10X_cells.AGCTCCTTCGTACGGC-L8TX_180712_01_B06,-4.7292953,6.971514 +10X_cells.AGTGTCAGTGTTCTTT-L8TX_180712_01_B06,-3.6401281,9.402841 +10X_cells.CACACCTTCGTTTAGG-L8TX_180712_01_B06,-0.8198741,6.676406 +10X_cells.CCATTCGGTGATGCCC-L8TX_180712_01_B06,-5.77916,7.558877 +10X_cells.CGAGAAGCATACGCTA-L8TX_180712_01_B06,-4.739533,10.365232 +10X_cells.CGTCACTCAGTAACGG-L8TX_180712_01_B06,-3.3845916,7.417332 +10X_cells.CTCATTAAGCCTTGAT-L8TX_180712_01_B06,0.7041869,7.1298876 +10X_cells.TCTATTGTCAAACCAC-L8TX_180712_01_B06,-2.7923255,7.602943 +10X_cells.TGACTAGAGGAGTCTG-L8TX_180712_01_B06,-4.6352544,6.8915915 +10X_cells.TGGCCAGTCTACTATC-L8TX_180712_01_B06,-5.2405124,10.149942 +10X_cells.ACAGCCGCAACTGCGC-L8TX_180712_01_C06,-4.950969,6.7932725 +10X_cells.CATGGCGTCTCACATT-L8TX_180712_01_C06,-4.0220237,9.050379 +Smartseq_cells.SM-GE67M_S368_E1-50,-4.1273785,6.882961 +Smartseq_cells.LS-15023_S64_E1-50,-7.8420143,10.617823 +Smartseq_cells.LS-15047_S12_E1-50,-6.071499,7.4597025 +Smartseq_cells.LS-15047_S67_E1-50,-7.5465565,10.791127 +Smartseq_cells.LS-15047_S77_E1-50,-6.9525213,11.694012 +Smartseq_cells.LS-15087_S61_E1-50,-6.6398945,8.469118 +Smartseq_cells.LS-15087_S64_E1-50,-7.01076,9.429875 +Smartseq_cells.LS-15087_S66_E1-50,-7.8901343,9.4943495 +Smartseq_cells.LS-15305_S71_E1-50,-4.0319467,6.034128 +Smartseq_cells.LS-15322_S02_E2-50,-7.854839,10.614063 +Smartseq_cells.LS-15325_S12_E2-50,-6.88891,8.424375 +Smartseq_cells.LS-15331_S94_E1-50,-5.579652,7.9191318 +Smartseq_cells.LS-15338_S45_E1-50,-6.2837467,7.750602 +Smartseq_cells.LS-15338_S46_E1-50,-7.4394646,10.790101 +Smartseq_cells.LS-15339_S10_E1-50,-6.2995024,7.7322817 +Smartseq_cells.LS-15339_S13_E1-50,-7.701442,11.143468 +Smartseq_cells.LS-15339_S20_E1-50,-6.879061,8.736153 +Smartseq_cells.LS-15367_S53_E1-50,-5.524011,7.118237 +Smartseq_cells.SM-D9EPG_S68_E1-50,-6.7720313,7.911341 +Smartseq_cells.SM-D9EPG_S77_E1-50,-6.9096403,8.456563 +Smartseq_cells.SM-D9EPG_S78_E1-50,-7.4756293,8.5772295 +Smartseq_cells.SM-D9EPG_S88_E1-50,-6.44844,7.915629 +Smartseq_cells.SM-D9EPG_S89_E1-50,-4.2850924,6.2203116 +Smartseq_cells.SM-D9EPH_S78_E1-50,-7.608083,9.32753 +Smartseq_cells.SM-D9D13_S88_E1-50,-6.8195806,9.410143 +Smartseq_cells.SM-D9D14_S52_E1-50,-4.0194154,6.028795 +Smartseq_cells.SM-D9D14_S53_E1-50,-4.6779103,6.905613 +Smartseq_cells.SM-D9D14_S54_E1-50,-5.335903,7.114292 +Smartseq_cells.SM-D9D7O_S24_E1-50,-5.7371407,7.371738 +Smartseq_cells.SM-D9D7O_S32_E1-50,-7.565475,8.850874 +Smartseq_cells.SM-D9E5X_S89_E1-50,-6.477855,7.734224 +Smartseq_cells.SM-GE659_S058_E1-50,-5.38269,11.578739 +Smartseq_cells.SM-GE64U_S053_E1-50,-7.184613,8.430533 +Smartseq_cells.SM-GE64U_S054_E1-50,-7.650623,8.762536 +10X_cells.GTGTTAGGTGGCAAAC-L8TX_180829_01_D09,-3.4725368,8.304264 +10X_cells.TTAGGACCAGTCGTGC-L8TX_180829_01_D09,-1.5285286,6.1506705 +10X_cells.ACGAGGAAGCCGGTAA-L8TX_180829_01_D10,1.4218528,6.938979 +10X_cells.ACTTTCACACTCTGTC-L8TX_180829_01_D10,0.15066719,6.215839 +10X_cells.CATGCCTGTAGCAAAT-L8TX_180829_01_D10,-0.5923758,6.4153905 +10X_cells.GCACATAAGAGTAAGG-L8TX_180829_01_D10,0.38945338,7.414393 +10X_cells.TCGTAGAGTAGGCTGA-L8TX_180829_01_D10,2.8546157,6.7706556 +10X_cells.GTGCAGCCAGTAAGAT-L8TX_180829_01_E10,0.5512455,6.6009994 +10X_cells.TCATTTGCAGAGCCAA-L8TX_180829_01_E10,-4.9527745,10.41172 +10X_cells.CTTGGCTGTACCGAGA-L8TX_180907_01_F10,2.025017,10.07807 +10X_cells.TCAGGATAGCACGCCT-L8TX_181011_01_G02,-4.34412,10.647903 +10X_cells.CGGACTGCAGGATTGG-L8TX_181011_01_C04,0.6516077,6.771816 +10X_cells.GGGCATCTCGGAATCT-L8TX_181012_01_G04,-3.743114,9.3047 +10X_cells.AGAATAGAGGTAGCTG-L8TX_181012_01_H04,0.9637683,6.7812157 +10X_cells.GGTGAAGCAGCGTAAG-L8TX_181012_01_H04,-4.8408194,6.7669835 +10X_cells.CTGGTCTTCACCACCT-L8TX_181012_01_E05,0.62840647,6.8359427 +10X_cells.GCGCAACGTTGGAGGT-L8TX_181012_01_E05,-0.669742,7.1642084 +10X_cells.GGGACCTTCAGCAACT-L8TX_181012_01_E05,-1.5303543,6.3835754 +10X_cells.CGAGAAGAGTGTCCAT-L8TX_180406_01_H01,-1.1231936,7.907646 +10X_cells.TGCCCATGTTCCACTC-L8TX_180406_01_H01,-3.2136242,8.545399 +10X_cells.ATTTCTGGTATGGTTC-L8TX_180406_01_H02,1.2179471,7.222365 +10X_cells.CGTGTAATCCACGAAT-L8TX_180406_01_H02,0.91647583,6.267871 +10X_cells.TAGGCATCAGATTGCT-L8TX_180406_01_H02,-1.5569978,6.9285574 +10X_cells.CAGGTGCCATGCTAGT-L8TX_180406_01_E06,-4.187821,8.283036 +10X_cells.GGAATAATCTGTTGAG-L8TX_180406_01_E06,-0.501287,8.352404 +10X_cells.TTCTCCTTCGATGAGG-L8TX_180406_01_C08,-2.7102895,8.30505 +10X_cells.AGAGCTTAGGCCCTTG-L8TX_180406_01_C07,-1.8566352,8.977034 +10X_cells.TAGCCGGAGAGCCCAA-L8TX_180406_01_C07,0.8390928,6.6549916 +Smartseq_cells.SM-GE5VA_S079_E1-50,-7.7026153,9.381013 +Smartseq_cells.SM-GE5V6_S130_E1-50,4.4640274,5.9492087 +Smartseq_cells.SM-GE5V6_S149_E1-50,-5.8531446,7.888014 +10X_cells.CCGGGATGTAGCAAAT-L8TX_200625_02_F11,-2.6943562,6.6292977 +10X_cells.ACACCCTGTCGAATCT-L8TX_171026_01_H03,-6.982348,10.04535 +10X_cells.CAGCATATCTTACCTA-L8TX_171026_01_F04,-6.4405513,9.835058 +10X_cells.GCCTCTACAATCCAAC-L8TX_171026_01_G04,-4.40606,7.2009306 +10X_cells.GAGGTGAGTCCAGTGC-L8TX_171026_01_F04,-8.064493,10.130903 +10X_cells.GTGCGGTAGAGTACAT-L8TX_171026_01_G04,-3.0801282,6.8319826 +10X_cells.TCACGAATCGGTTAAC-L8TX_171026_01_H03,-4.9118176,10.305323 +10X_cells.GGAACTTGTAGCCTAT-L8TX_171026_01_F04,-7.554822,9.82331 +10X_cells.CGTTGGGCACAACTGT-L8TX_171026_01_G04,-5.8226275,7.883603 +10X_cells.GCGCGATGTCAAAGAT-L8TX_171026_01_H03,-0.5812425,6.1283426 +10X_cells.GCCTCTAAGGGTGTGT-L8TX_171026_01_H04,-6.531981,10.293532 +10X_cells.TAAGCGTCAGCAGTTT-L8TX_171026_01_E05,-5.1474395,7.5445604 +10X_cells.CGTGAGCTCAAGGTAA-L8TX_171026_01_H04,-6.798565,8.598043 +10X_cells.GTAACGTTCACTCTTA-L8TX_171026_01_H03,-5.0120783,10.051901 +10X_cells.TGACGGCTCTTAGAGC-L8TX_171026_01_G04,-7.503174,12.466388 +10X_cells.GGATTACGTTGACGTT-L8TX_171026_01_H04,-6.5101175,8.563187 +10X_cells.AAGCCGCTCCCTTGCA-L8TX_171026_01_F04,-6.453908,9.476376 +10X_cells.CGATTGAAGCGAAGGG-L8TX_171026_01_H05,-7.90399,11.333885 +10X_cells.AGAGCTTTCGGAAATA-L8TX_171026_01_G03,-5.8577952,10.601049 +10X_cells.CGTGTCTCAGCCAGAA-L8TX_171026_01_H04,-5.076878,8.816557 +10X_cells.TGCGCAGAGATGTAAC-L8TX_171026_01_G04,-7.2718306,10.954181 +10X_cells.AGTAGTCTCAGCCTAA-L8TX_171026_01_H04,-3.7907267,11.14617 +10X_cells.GGGCATCAGGCAATTA-L8TX_171026_01_F04,-6.5320797,8.1417675 +10X_cells.CGAGAAGCATGGAATA-L8TX_171026_01_G03,1.6635987,6.2658916 +10X_cells.TTCGAAGGTAAGGATT-L8TX_171026_01_C05,-4.1594486,9.393062 +10X_cells.CCGTTCAGTCTAAACC-L8TX_171026_01_F04,-3.1248655,9.707178 +10X_cells.GCGCCAAAGCTAACAA-L8TX_171026_01_F05,-3.546251,10.146851 +10X_cells.GTCAAGTGTAGCGCAA-L8TX_171026_01_B05,-5.016515,8.890918 +10X_cells.AAGGCAGTCACAATGC-L8TX_171026_01_A04,-5.149506,7.246224 +10X_cells.TACACGAAGTAGATGT-L8TX_171026_01_D05,-6.5928607,11.080783 +10X_cells.GATCTAGGTGTAACGG-L8TX_171026_01_E05,-3.4099867,8.25664 +10X_cells.TGGTTAGAGCCACTAT-L8TX_171026_01_F03,-3.0981467,6.989965 +10X_cells.ATTTCTGTCGACGGAA-L8TX_171026_01_H05,-6.1751595,7.6067996 +10X_cells.TGTGTTTTCACAGTAC-L8TX_171026_01_G04,-6.7671127,9.33052 +10X_cells.CACTCCAGTGGTAACG-L8TX_171026_01_B05,-4.4918933,9.339625 +10X_cells.TGAGCATAGGTAGCCA-L8TX_171026_01_H04,-5.604034,10.228014 +10X_cells.ACTTGTTCAAATACAG-L8TX_171026_01_F03,-4.614343,8.331299 +10X_cells.GCGCAACCATATGCTG-L8TX_171026_01_A05,-5.620759,11.050988 +10X_cells.CTCGTCAAGGCTAGCA-L8TX_171026_01_H03,-4.982756,9.233404 +10X_cells.TTCTCCTGTCTCATCC-L8TX_171026_01_G05,-5.0537524,6.6522813 +10X_cells.GGTGTTATCGCCTGTT-L8TX_171026_01_A04,-6.82003,10.097062 +10X_cells.GGCTCGAAGTGTGGCA-L8TX_171026_01_F03,-5.1311107,10.291899 +Smartseq_cells.SM-DD44L_S30_E1-50,-7.8709006,9.801748 +Smartseq_cells.SM-GE935_S043_E1-50,-5.5393705,7.2046547 +Smartseq_cells.SM-GE935_S196_E1-50,-7.706849,9.6898775 +Smartseq_cells.SM-GE935_S242_E1-50,-6.913546,9.033902 +Smartseq_cells.SM-GE935_S290_E1-50,-7.8251805,9.522792 +Smartseq_cells.SM-GE92H_S274_E1-50,-6.7914653,8.012519 +Smartseq_cells.SM-GE92H_S284_E1-50,-7.7892,9.262075 +Smartseq_cells.SM-GE92I_S254_E1-50,-7.3427534,10.740322 +Smartseq_cells.SM-GE92I_S262_E1-50,-6.555714,7.966422 +Smartseq_cells.SM-GE92I_S269_E1-50,-4.316433,6.1381044 +Smartseq_cells.SM-GE92L_S030_E1-50,-7.8701982,9.722191 +Smartseq_cells.SM-GE92L_S035_E1-50,-7.1768394,9.309369 +Smartseq_cells.SM-GE92L_S041_E1-50,-6.4870586,8.224361 +Smartseq_cells.SM-GE92L_S172_E1-50,-6.914943,10.536895 +Smartseq_cells.SM-GE92L_S233_E1-50,-7.796362,11.752096 +Smartseq_cells.SM-GE92L_S246_E1-50,-7.587514,11.270932 +Smartseq_cells.SM-GE92L_S259_E1-50,-7.475759,11.810867 +Smartseq_cells.SM-GE92M_S051_E1-50,-7.140766,8.383109 +Smartseq_cells.SM-GE92M_S088_E1-50,-6.8946233,8.033021 +10X_cells.TGTGTTTGTCCGTTAA-L8TX_181206_01_A12,-7.380096,10.974524 +10X_cells.TAAGTGCTCGCTGATA-L8TX_181206_01_B12,-3.9935615,7.0114193 +10X_cells.TAGGCATAGGTGCAAC-L8TX_181206_01_C12,-1.8628032,6.568811 +10X_cells.TCGGGACAGTCACGCC-L8TX_180406_01_B01,-1.7449034,6.688172 +10X_cells.CAGAGAGGTTCCATGA-L8TX_180406_01_C01,0.44248328,7.565078 +10X_cells.AGAGCTTTCTATGTGG-L8TX_180406_01_D01,1.4570018,7.356968 +10X_cells.ACGATGTCAGCTGCAC-L8TX_180406_01_E01,0.59406406,7.9759984 +10X_cells.TTAACTCAGACAGAGA-L8TX_180406_01_G01,-1.1828794,9.559278 +10X_cells.GGAATAATCCTGCAGG-L8TX_180406_01_B02,-0.2527849,6.814068 +10X_cells.GCGGGTTAGTGTTAGA-L8TX_180406_01_C02,-5.1523046,7.2362723 +10X_cells.ACGGGCTAGCGTAGTG-L8TX_180406_01_D02,1.1698439,6.853707 +10X_cells.ATGAGGGGTAATAGCA-L8TX_190312_01_D02,-3.7322974,6.6816907 +10X_cells.AACTCAGGTGCTGTAT-L8TX_180221_01_D10,-1.1021684,6.9681964 +10X_cells.GAGTCCGCAGGTGGAT-L8TX_180221_01_D10,-4.8109117,7.3113613 +10X_cells.ACGTCAAGTAAGCACG-L8TX_180221_01_E10,2.7121496,7.0300155 +10X_cells.CACAAACAGGATGGTC-L8TX_180221_01_E10,-2.5276513,6.742236 +10X_cells.CGGCTAGCATCCCATC-L8TX_180221_01_E10,-3.7343118,7.915252 +10X_cells.GTAACGTGTACCAGTT-L8TX_180221_01_E10,0.10037051,9.328706 +10X_cells.AAAGATGAGGGTTTCT-L8TX_180221_01_F10,-1.0815834,8.591913 +10X_cells.CATGGCGGTTATGCGT-L8TX_180221_01_F10,-2.4663563,8.324163 +10X_cells.GCGCAACCAGTAACGG-L8TX_180221_01_F10,-1.2609235,8.762623 +10X_cells.GCTGCGATCGGAATCT-L8TX_180221_01_F10,-2.0638418,6.881461 +10X_cells.GTGCATATCTAACTCT-L8TX_180221_01_F10,-0.15338056,7.637124 +10X_cells.CACCTTGCAAGGTGTG-L8TX_180221_01_H10,-2.0576205,8.243229 +10X_cells.CCCATACTCTGGTTCC-L8TX_180221_01_H10,-4.050859,6.931746 +10X_cells.ATTTCTGCATGAGCGA-L8TX_190312_01_C02,-0.86326355,7.8110285 +10X_cells.AGATCTGAGAAGGTTT-L8TX_190312_01_D02,-4.8326426,6.9924693 +10X_cells.ATCATGGTCGTTGACA-L8TX_190312_01_D02,0.36389878,6.3653173 +10X_cells.TCGGGACAGCACAGGT-L8TX_190312_01_D02,1.5824574,6.431987 +10X_cells.TGCCAAAAGACTAAGT-L8TX_190312_01_D02,1.6158977,6.200622 +10X_cells.ACTTACTTCAACACTG-L8TX_190312_01_G02,-3.8861797,11.15386 +10X_cells.CACTCCACAGATCTGT-L8TX_180907_01_B11,0.08675387,6.1933084 +10X_cells.CCTCTGACAGGGTACA-L8TX_180907_01_B11,-7.776613,9.590287 +10X_cells.TGAGAGGAGGCCATAG-L8TX_180907_01_B11,4.382727,5.3463507 +10X_cells.CACAGTACAGATAATG-L8TX_180926_01_E12,-4.8084426,9.2397995 +10X_cells.TCTTTCCAGTGGTAAT-L8TX_180926_01_E12,-2.6761508,8.425477 +10X_cells.CCTTCCCCATGTAGTC-L8TX_181012_01_B05,-1.8284608,6.7872143 +10X_cells.AGACGTTCAGCTTCGG-L8TX_181012_01_C05,-5.2823215,8.008972 +10X_cells.GTGGGTCGTGGTCCGT-L8TX_181012_01_C05,-2.3221316,6.8345714 +10X_cells.TCTCTAAAGGCCCTTG-L8TX_181012_01_C05,-7.2810974,11.109469 +Smartseq_cells.SM-GE95K_S109_E1-50,-7.921303,9.10539 +Smartseq_cells.SM-GE8XO_S100_E1-50,-5.4617643,7.3841376 +10X_cells.CCTATTAGTTTACTCT-L8TX_180221_01_B11,-5.969299,7.7631764 +10X_cells.CGATCGGTCGTCCGTT-L8TX_180221_01_D11,-7.3573866,12.053362 +10X_cells.GCCAAATCAGACGCAA-L8TX_180221_01_D11,-2.7821922,15.293332 +Smartseq_cells.SM-GE67Q_S041_E1-50,-4.5014277,14.456424 +10X_cells.CCATTCGCATATACCG-L8TX_180907_01_A12,-1.8091594,7.0194235 +10X_cells.AGCGTATTCTCTGTCG-L8TX_180907_01_B12,-4.254469,6.8596773 +10X_cells.CCATGTCTCACATGCA-L8TX_180907_01_B12,-2.81625,8.812023 +Smartseq_cells.SM-GE5US_S235_E1-50,-4.8225245,6.485826 +10X_cells.CAACCTCTCTTAGAGC-L8TX_180926_01_E01,-0.6521897,6.4733233 +10X_cells.ATTACTCTCACTTACT-L8TX_180926_01_F01,-6.261297,8.882407 +10X_cells.CCCAGTTGTGTTTGGT-L8TX_180926_01_F01,-2.6388457,7.472586 +10X_cells.CTCGTACTCGAGAGCA-L8TX_180926_01_F01,-1.6447662,6.377203 +10X_cells.CCTTCGATCTGAGGGA-L8TX_181011_01_B03,-2.0937753,6.6853085 +10X_cells.GATTCAGGTCGGGTCT-L8TX_181011_01_B03,0.3077486,6.2909007 +10X_cells.GTACTTTCATATGGTC-L8TX_181011_01_B03,0.10456361,6.216334 +10X_cells.TAAACCGTCCCAACGG-L8TX_181011_01_B03,-3.3633788,9.803532 +10X_cells.TGAGAGGCAGCCTTTC-L8TX_181011_01_C03,-2.9384186,9.018769 +10X_cells.TTATGCTAGCATCATC-L8TX_181011_01_C03,-4.940524,10.14171 +Smartseq_cells.SM-GE914_S363_E1-50,-6.53206,7.7306113 +10X_cells.AGATTGCCAGAGCCAA-L8TX_180221_01_B12,1.1773878,7.2136173 +10X_cells.AACCGCGGTGCTTCTC-L8TX_180712_01_E05,-0.23277551,7.1050243 +10X_cells.CCATTCGAGACGCAAC-L8TX_180712_01_E05,-0.09456167,7.662072 +10X_cells.CGTTCTGCACAGCGTC-L8TX_180712_01_E05,0.49134094,7.4412127 +10X_cells.GCACATACACATGACT-L8TX_180712_01_E05,-2.183242,7.3114247 +10X_cells.TCAGGATTCAAGGCTT-L8TX_180712_01_E05,-1.1257865,7.12435 +10X_cells.CTGGTCTGTAAATGTG-L8TX_180712_01_F05,-0.10723473,7.504979 +10X_cells.GACACGCAGTGGAGTC-L8TX_180712_01_F05,-4.5605197,10.239211 +10X_cells.GGGTTGCAGTGGAGAA-L8TX_180712_01_F05,1.7244774,6.233007 +10X_cells.TATCAGGTCGTGGTCG-L8TX_180712_01_F05,-2.970159,6.943698 +10X_cells.ACTGAGTAGCGTCTAT-L8TX_180712_01_H05,6.3712697,6.0489717 +10X_cells.CACAGGCTCTAACTCT-L8TX_180712_01_H05,-4.520987,6.87835 +10X_cells.CTGCCTATCGTTGACA-L8TX_180712_01_H05,-2.1665242,6.753321 +10X_cells.GCACTCTTCGTTTGCC-L8TX_180712_01_H05,-1.7961181,7.663019 +10X_cells.GTGCAGCAGATCTGCT-L8TX_180712_01_H05,-3.0354574,6.773467 +10X_cells.TGAGAGGCATTCTTAC-L8TX_180712_01_H05,-3.435398,10.7393675 +10X_cells.CAGCGACTCAAACCGT-L8TX_180712_01_A06,-2.53564,6.5132537 +10X_cells.CGAACATGTTCGGGCT-L8TX_180712_01_A06,-4.692018,6.8864913 +10X_cells.CTCGAGGTCCGCTGTT-L8TX_180712_01_A06,-2.4367688,7.552419 +10X_cells.CTGATAGGTCCGAGTC-L8TX_180712_01_A06,-0.5385747,6.5348363 +10X_cells.GCAAACTTCGGAAATA-L8TX_180712_01_A06,-6.571657,7.936108 +10X_cells.TGCCAAAAGGCCCTCA-L8TX_180712_01_A06,-4.2570057,9.813805 +10X_cells.TTCGGTCGTGCCTGGT-L8TX_180712_01_A06,0.06590572,6.7626553 +10X_cells.ACACCCTGTAAATGTG-L8TX_180504_01_E01,-1.5735073,6.5160556 +10X_cells.CCTTCCCCAACACCTA-L8TX_180504_01_E01,0.099879876,7.9756055 +10X_cells.CGAATGTCAAGTTGTC-L8TX_180504_01_E01,1.1960409,7.2088804 +10X_cells.CTCATTACACGTCAGC-L8TX_180504_01_E01,0.8690902,6.6483965 +10X_cells.TGCTGCTGTAGCCTCG-L8TX_180504_01_E01,-1.6977303,7.847443 +10X_cells.AACGTTGAGAGTCGGT-L8TX_180221_01_A12,-0.3455712,6.97639 +10X_cells.CACAGGCGTGTGAAAT-L8TX_180221_01_A12,-1.8329973,10.758549 +10X_cells.CACCACTTCCGTTGTC-L8TX_180221_01_A12,-1.7387214,6.291992 +10X_cells.CAGCAGCAGGCATGGT-L8TX_180221_01_A12,-0.75755566,6.804352 +10X_cells.CTAATGGCACTTGGAT-L8TX_180221_01_A12,-1.5572543,7.3791265 +10X_cells.GGCCGATCATTAGGCT-L8TX_180221_01_A12,-0.408383,6.6754313 +10X_cells.TTTCCTCGTAGGCATG-L8TX_180221_01_A12,-4.059879,6.3443336 +10X_cells.ATCTACTTCCCACTTG-L8TX_180221_01_B12,1.4931425,7.1188436 +10X_cells.CTGCGGAGTGTGAATA-L8TX_180221_01_B12,0.20029007,7.622445 +10X_cells.TGCCAAAAGCTTATCG-L8TX_180221_01_B12,-2.1938255,6.947733 +10X_cells.CTACCCAAGCCACGTC-L8TX_180221_01_C12,1.5290633,6.9189544 +10X_cells.CACAGGCAGTCGCCGT-L8TX_180221_01_H11,-0.7882651,7.092377 +10X_cells.TTCGAAGGTTCCATGA-L8TX_180221_01_H11,-0.5799502,6.75057 +10X_cells.ATTCTACTCTTGTATC-L8TX_200611_02_A05,-4.4289637,6.780792 +10X_cells.GTTCTCGCAACGCACC-L8TX_200611_02_A05,-1.5043153,6.985909 +Smartseq_cells.SM-GE679_S161_E1-50,-5.2562747,7.0955057 +10X_cells.AGTCTTTCATGCGCAC-L8TX_180115_01_G10,-0.3919005,7.189558 +10X_cells.CTAGCCTAGATACACA-L8TX_180115_01_C09,4.3845677,5.1980433 +10X_cells.GATCGCGGTCGCCATG-L8TX_180115_01_G09,-3.1806262,7.6999025 +10X_cells.GTCGTAAAGACCCACC-L8TX_180115_01_C11,-4.7107067,7.4576063 +10X_cells.TGCGGGTAGCTAACTC-L8TX_180115_01_C11,-0.02893387,7.425393 +10X_cells.TAGAGCTTCGTCGTTC-L8TX_180115_01_H10,-6.409183,9.409951 +10X_cells.TAGCCGGCACAACGTT-L8TX_180115_01_H10,-0.9962764,6.215151 +10X_cells.AGCTCTCGTTCAGACT-L8TX_180115_01_C11,-2.0245295,6.756659 +10X_cells.TCGTACCCAATCACAC-L8TX_180115_01_F10,-3.4040375,7.433502 +10X_cells.ACTTTCATCGCTTAGA-L8TX_180115_01_F11,-4.936081,8.0291395 +10X_cells.AACTTTCTCTATGTGG-L8TX_180115_01_A11,-5.449386,7.6952653 +10X_cells.CGAGCCATCGTTTATC-L8TX_180115_01_B09,-2.9732878,7.620088 +10X_cells.AACCGCGAGCCACTAT-L8TX_180115_01_H10,-5.8517847,9.294261 +10X_cells.GGTGAAGTCCCAACGG-L8TX_180115_01_G10,4.0049486,7.013083 +10X_cells.ACCTTTACAAGAGTCG-L8TX_180115_01_D11,-4.0815234,6.4701443 +10X_cells.CAGCCGATCACCACCT-L8TX_180115_01_D10,-1.4652946,7.1270766 +10X_cells.GCTGCTTAGATATGGT-L8TX_180115_01_F11,-1.6124954,6.337761 +10X_cells.GGACGTCGTACCCAAT-L8TX_180115_01_H09,-5.628004,9.166416 +10X_cells.CCATGTCTCAGGCCCA-L8TX_180115_01_G09,-2.9504735,7.5072765 +10X_cells.CCTACACAGATCACGG-L8TX_180115_01_G10,-2.6900022,7.504538 +10X_cells.GACGGCTGTCCAAGTT-L8TX_180115_01_F10,-1.9778336,7.0097117 +10X_cells.GTCACAATCGTCCGTT-L8TX_180115_01_F10,5.071356,5.216694 +10X_cells.GGGCACTAGGACACCA-L8TX_180115_01_B11,-4.5802484,7.700125 +10X_cells.AGTGGGATCAACGAAA-L8TX_180115_01_G11,-1.9706491,7.4270124 +10X_cells.GATCTAGTCTGAAAGA-L8TX_180115_01_E09,-3.693763,7.2243714 +10X_cells.ACTTACTTCAAACCGT-L8TX_180115_01_G10,-1.3047482,6.4143267 +10X_cells.CTACCCAGTTCGTTGA-L8TX_180115_01_H11,-4.292268,7.1947727 +10X_cells.TAGGCATCAAGAGTCG-L8TX_180115_01_A11,-4.883693,6.5182786 +10X_cells.GATGCTATCGAGAACG-L8TX_180115_01_C11,-6.9917974,10.106289 +10X_cells.CCTTACGTCAACGGGA-L8TX_180115_01_G11,-3.3247502,9.776583 +10X_cells.CGGACACAGCGTTTAC-L8TX_180115_01_A11,-4.9668107,6.905142 +10X_cells.GAATGAAAGCCAGAAC-L8TX_180115_01_G10,-3.007833,7.2038693 +10X_cells.CATCGAACAGACGCAA-L8TX_180115_01_H11,-4.5495524,7.532933 +10X_cells.CGTCAGGAGTTGAGTA-L8TX_180115_01_B09,-5.9346786,9.379973 +10X_cells.TAGGCATTCAATCACG-L8TX_180115_01_F11,-0.12851602,6.321284 +10X_cells.TCTGAGAAGCGGATCA-L8TX_180115_01_D09,2.8653216,6.421797 +10X_cells.CGAGCCACAGCCTATA-L8TX_180115_01_A11,-1.395491,6.3610325 +10X_cells.GTAGGCCTCCGCGCAA-L8TX_180115_01_F11,-4.3447366,7.317339 +10X_cells.TTTCCTCGTCGCTTCT-L8TX_180115_01_C10,-4.6528587,8.81937 +10X_cells.GTTTCTAAGGGTCTCC-L8TX_180115_01_F11,-3.8024802,12.099477 +10X_cells.CTACATTTCTATCCCG-L8TX_180115_01_F10,-6.4660373,10.099971 +10X_cells.CGCTGGAAGATCTGCT-L8TX_180115_01_F10,1.1386353,6.6798964 +10X_cells.TATTACCTCCCATTAT-L8TX_180115_01_E09,-4.8872805,7.5735173 +10X_cells.CGGCTAGCATTTCACT-L8TX_180115_01_H10,-2.078815,6.7250714 +10X_cells.TCCACACCATGGGACA-L8TX_180115_01_D09,3.0252943,6.254554 +10X_cells.TCAATCTAGCCATCGC-L8TX_180115_01_B11,-1.1463377,7.094285 +10X_cells.CAAGATCTCTGACCTC-L8TX_180115_01_H10,2.184131,6.282198 +10X_cells.CGCGTTTGTAGAGTGC-L8TX_180115_01_H11,-5.7368445,7.3912234 +10X_cells.TAAGCGTGTTGTGGAG-L8TX_180115_01_H10,-4.633433,7.4584603 +10X_cells.ACGATGTTCGATGAGG-L8TX_180115_01_B11,-3.9203358,7.6345925 +10X_cells.GATGAGGTCGCTAGCG-L8TX_180115_01_A09,-5.3441005,8.089858 +10X_cells.GAACATCGTTGAACTC-L8TX_180115_01_E11,-6.756587,10.086463 +10X_cells.CACTCCACATACTCTT-L8TX_180115_01_B10,-5.132732,8.949585 +10X_cells.TCGTACCCATGCCTTC-L8TX_180115_01_B09,-1.5771078,6.585527 +Smartseq_cells.SM-GE5PM_S030_E1-50,-7.5030513,8.423951 +Smartseq_cells.SM-GE5PE_S003_E1-50,-7.6836457,10.940641 +10X_cells.AGATCTGTCATGTGGT-L8TX_171120_01_G07,-2.4646833,7.7122345 +10X_cells.CGATCGGGTCGCCATG-L8TX_171120_01_G07,-5.4447455,8.232154 +10X_cells.ACACCCTGTACTTAGC-L8TX_171120_01_H07,-5.065436,7.751192 +10X_cells.TCAACGAGTGAGGGTT-L8TX_171120_01_H07,-3.6028183,10.0171585 +10X_cells.ACGGGCTAGTGGGATC-L8TX_171120_01_C07,-5.5343924,7.858325 +10X_cells.ATCCGAAAGAGTGAGA-L8TX_171120_01_C07,-7.306404,9.137995 +10X_cells.CGTAGCGGTGGTACAG-L8TX_171120_01_C07,-4.903465,9.531605 +10X_cells.TCCCGATCATGGTCAT-L8TX_171120_01_C07,-3.046923,6.572228 +10X_cells.ACGCCAGCAACGATCT-L8TX_171120_01_D07,-7.6448226,11.574873 +10X_cells.CTGAAGTTCCATGAAC-L8TX_171120_01_D07,-4.780356,7.521745 +10X_cells.CATCCACGTCTTCGTC-L8TX_171120_01_E07,-4.6868577,8.191978 +10X_cells.TTTGGTTAGGATGGTC-L8TX_171120_01_E07,-5.2559576,7.520293 +10X_cells.AAACGGGTCATTATCC-L8TX_180115_01_F08,4.4609923,5.7456484 +10X_cells.TGCACCTTCAAGATCC-L8TX_180115_01_C08,-4.0854974,9.61065 +10X_cells.ACTGAACAGGCGACAT-L8TX_180115_01_E08,-7.777178,11.475856 +10X_cells.CATTATCTCGCAGGCT-L8TX_180115_01_E08,-4.3022437,7.191536 +10X_cells.TAGTTGGTCACTTACT-L8TX_180115_01_E08,-1.1167479,6.6487985 +Smartseq_cells.LS-15008_S56_E1-50,-5.825887,7.2715116 +Smartseq_cells.LS-15015_S84_E1-50,-7.3739924,8.260474 +Smartseq_cells.LS-15016_S19_E1-50,-5.7472124,7.042438 +Smartseq_cells.LS-15060_S73_E1-50,-7.3831706,10.516024 +Smartseq_cells.LS-15061_S49_E1-50,-7.2083697,8.546736 +Smartseq_cells.LS-15064_S44_E1-50,-4.666408,6.3514667 +Smartseq_cells.LS-15072_S78_E1-50,-7.0459886,8.225898 +Smartseq_cells.LS-15072_S80_E1-50,-6.52189,8.992355 +Smartseq_cells.LS-15097_S55_E1-50,4.27672,6.1804576 +Smartseq_cells.LS-15305_S93_E1-50,-7.3859944,11.295373 +Smartseq_cells.LS-15307_S94_E1-50,-7.2510366,8.163885 +Smartseq_cells.LS-15352_S63_E1-50,-7.680683,10.956637 +Smartseq_cells.LS-15354_S95_E1-50,-7.489869,8.494076 +Smartseq_cells.LS-15363_S77_E1-50,-7.6205745,9.747017 +Smartseq_cells.LS-15366_S46_E1-50,-7.0735197,10.076001 +Smartseq_cells.LS-15382_S15_E1-50,-7.559507,8.947809 +Smartseq_cells.LS-15509_S86_E2-50,-6.41035,7.630503 +Smartseq_cells.LS-15509_S96_E2-50,-5.447143,6.9379864 +Smartseq_cells.LS-15510_S80_E1-50,-6.5891576,7.963933 +Smartseq_cells.LS-15513_S31_E1-50,-7.777466,9.238193 +Smartseq_cells.LS-15514_S16_E1-50,-7.351047,10.884196 +Smartseq_cells.LS-15544_S57_E1-50,-6.8548584,7.888345 +Smartseq_cells.LS-15544_S74_E1-50,-6.47312,7.642094 +Smartseq_cells.LS-15544_S82_E1-50,-6.8268538,8.070372 +Smartseq_cells.LS-15544_S84_E1-50,-6.70638,7.7787747 +Smartseq_cells.LS-15544_S85_E1-50,-6.5494876,8.1843195 +Smartseq_cells.LS-15546_S46_E1-50,-6.719069,7.8832245 +Smartseq_cells.SM-D9E5J_S92_E1-50,-5.5805798,6.9672136 +Smartseq_cells.SM-D9E5W_S48_E1-50,-6.121106,7.663459 +Smartseq_cells.SM-D9E61_S85_E1-50,-4.4959126,6.2765694 +Smartseq_cells.SM-D9E61_S95_E1-50,-6.942455,8.69545 +Smartseq_cells.SM-D9E63_S59_E1-50,-3.748174,5.950481 +Smartseq_cells.SM-D9E63_S86_E1-50,-5.737486,7.1423297 +Smartseq_cells.SM-DD45K_S138_E1-50,-3.7915635,6.3414617 +Smartseq_cells.SM-DD45L_S050_E1-50,-5.6596546,7.117827 +Smartseq_cells.SM-GE64U_S029_E1-50,-7.395379,8.403126 +Smartseq_cells.SM-GE65Z_S113_E1-50,-7.549469,8.5645075 +Smartseq_cells.SM-GE65Z_S146_E1-50,-8.194189,9.984773 +Smartseq_cells.SM-GE65Z_S148_E1-50,-6.375654,8.072397 +Smartseq_cells.SM-GE65Z_S168_E1-50,-7.4791675,11.478528 +10X_cells.GAAGCAGCACACAGAG-L8TX_180221_01_F09,-4.6804523,10.360131 +10X_cells.CGTCTACAGAAACCTA-L8TX_180221_01_H09,-6.159687,13.555461 +10X_cells.CTTAGGATCCTTGGTC-L8TX_180221_01_H09,-4.831348,9.565581 +10X_cells.CGAATGTGTCCTGCTT-L8TX_180221_01_B10,-4.2541647,8.64407 +10X_cells.CGGAGTCCATCCAACA-L8TX_180221_01_B10,-6.0051804,11.329208 +10X_cells.CCTACACAGTACCGGA-L8TX_180221_01_C10,-5.5601397,11.982705 +10X_cells.TCAATCTAGCTCAACT-L8TX_180221_01_C10,-3.2400904,11.085455 +10X_cells.GAAGCAGAGAGTAATC-L8TX_180221_01_H12,-3.890801,9.035308 +10X_cells.TTTCCTCAGGTGATAT-L8TX_180221_01_H12,-3.0005457,7.9496245 +10X_cells.ACGGGTCAGTGGGATC-L8TX_180221_01_E09,-5.993954,13.391981 +10X_cells.TTAGTTCGTCTAGGTT-L8TX_180221_01_E09,-4.186881,9.961639 +10X_cells.GCGCAACCAGTTCCCT-L8TX_180221_01_D09,-4.281833,8.588931 +10X_cells.GCAATCACATGCTAGT-L8TX_180607_01_C05,-3.5638146,9.030594 +10X_cells.GTTCGGGAGGTGTGGT-L8TX_180607_01_C05,-2.8540056,7.444366 +10X_cells.CTGCCTACAAGAGTCG-L8TX_180712_01_G05,-5.5383034,11.398086 +10X_cells.CACCTTGCAGACGCCT-L8TX_180712_01_B06,-4.2964706,10.019548 +10X_cells.TGTGTTTTCCACGCAG-L8TX_180712_01_B06,-5.654161,11.378678 +10X_cells.ACGGCCAAGCAGCGTA-L8TX_180712_01_C06,-3.9288397,8.562818 +Smartseq_cells.LS-15307_S71_E1-50,-6.578061,12.342782 +Smartseq_cells.LS-15329_S19_E1-50,-6.128952,13.507745 +10X_cells.AAGGTTCTCCTATTCA-L8TX_181012_01_E05,-2.8641071,8.265709 +10X_cells.CACTCCATCAAACAAG-L8TX_180829_01_D10,-5.4663987,11.066383 +10X_cells.CCAATCCTCCGCGGTA-L8TX_180829_01_D10,-2.9945726,8.175354 +10X_cells.CTGCGGAAGCGAGAAA-L8TX_180829_01_D10,-3.252827,11.169581 +10X_cells.GGGACCTGTTCAGACT-L8TX_180829_01_D10,-3.347833,9.973786 +10X_cells.TCGAGGCAGCGTTTAC-L8TX_180829_01_D10,-4.402383,9.146317 +10X_cells.CTGATAGTCTCCTATA-L8TX_180907_01_F10,-5.1471786,11.045389 +10X_cells.GCTGCTTAGAGTACAT-L8TX_180907_01_F10,-5.442582,10.004545 +10X_cells.GTCACAAGTTAAAGTG-L8TX_180907_01_F10,-4.044555,10.372029 +10X_cells.TATTACCCAATGGTCT-L8TX_180907_01_F10,-3.8200445,9.189484 +10X_cells.GTGCTTCTCTACCTGC-L8TX_180907_01_G10,-3.151164,9.467639 +10X_cells.GGCTCGAGTTGCGTTA-L8TX_181011_01_G02,-4.6901417,10.16016 +10X_cells.CCTTCCCTCCGTTGTC-L8TX_181011_01_H02,-3.983708,10.882475 +10X_cells.GCTGCGAAGACTAGAT-L8TX_181011_01_H02,-5.1976137,11.317552 +10X_cells.CGTCCATGTACGACCC-L8TX_181011_01_C04,-3.2550669,11.033944 +10X_cells.CGTGTAAGTGACGCCT-L8TX_181012_01_G04,-3.3658257,8.168001 +10X_cells.GCCAAATGTGAAAGAG-L8TX_181012_01_G04,-2.5502887,8.489042 +10X_cells.GTCGGGTTCGCTGATA-L8TX_181012_01_G04,-5.0780454,10.362461 +10X_cells.TCAACGAAGGCCCTCA-L8TX_181012_01_G04,-2.872926,7.7930074 +10X_cells.AAAGCAACAATGTTGC-L8TX_181012_01_H04,-4.3713303,9.75024 +10X_cells.AAGTCTGAGAGCCCAA-L8TX_181012_01_H04,-5.7507133,10.575005 +10X_cells.GAACATCGTGCAGTAG-L8TX_181012_01_H04,-6.0926657,11.452343 +10X_cells.TCACGAAGTAAAGGAG-L8TX_181012_01_H04,-4.443163,9.443146 +10X_cells.CAAGAAACATTGGCGC-L8TX_181012_01_E05,-3.873681,8.4846115 +10X_cells.GCGGGTTTCTTCATGT-L8TX_181012_01_E05,-3.9520352,9.380429 +10X_cells.GGCTGGTTCGGAATCT-L8TX_181012_01_E05,-2.760619,8.334158 +10X_cells.TTGGAACTCCACTGGG-L8TX_181012_01_E05,-4.333699,9.355303 +Smartseq_cells.SM-GE5VH_S266_E1-50,-6.6780686,13.058306 +Smartseq_cells.SM-GE5VB_S301_E1-50,-6.8747797,12.932234 +10X_cells.ATAACGCCAAAGCAAT-L8TX_180406_01_H02,-2.7555943,11.597565 +10X_cells.GGACAGACAGTTTACG-L8TX_180406_01_H01,-4.0900607,9.578175 +10X_cells.CCACGGAGTCTAAACC-L8TX_180406_01_H02,-2.696976,10.51864 +10X_cells.GCATGATTCTCTAAGG-L8TX_180406_01_B06,-0.6170389,8.658273 +10X_cells.GATTCAGTCGGCGCAT-L8TX_180406_01_C08,-1.9549721,10.83649 +10X_cells.ATTATCCAGAGGTACC-L8TX_171026_01_A04,-6.734301,13.09558 +10X_cells.ACATCAGAGATGAGAG-L8TX_171026_01_A05,-6.05816,11.847035 +10X_cells.GGTGTTATCTGCGTAA-L8TX_171026_01_H03,-4.144891,9.162948 +10X_cells.AGGGTGAAGTGTGAAT-L8TX_171026_01_E05,-4.904455,10.658271 +10X_cells.AGTGAGGCAACGATGG-L8TX_171026_01_E05,-6.7818103,13.272322 +10X_cells.CATCGAATCGCTTGTC-L8TX_171026_01_E05,-4.5541434,11.847733 +10X_cells.TTGGCAATCCTTTCGG-L8TX_171026_01_F03,-4.8177423,10.176264 +10X_cells.ATTATCCTCCAACCAA-L8TX_171026_01_A05,-6.5022078,13.547463 +10X_cells.CCACCTACATCAGTCA-L8TX_171026_01_C05,-5.740618,11.548423 +10X_cells.TCATTTGTCGCGTAGC-L8TX_171026_01_F05,-3.426871,7.75629 +10X_cells.TTAACTCAGTCCATAC-L8TX_171026_01_H05,-6.9534454,10.573663 +10X_cells.AGCAGCCCATCACAAC-L8TX_171026_01_G03,-6.4614196,13.291109 +10X_cells.GTCTCGTGTCCGTCAG-L8TX_171026_01_F04,-6.214243,13.827189 +10X_cells.GTTCATTCAGTAAGAT-L8TX_171026_01_A05,-5.1818876,10.991465 +10X_cells.CAGCTAAAGGCTCATT-L8TX_171026_01_F05,-6.378973,11.34977 +10X_cells.GATGAAATCTTACCTA-L8TX_171026_01_G04,-3.7207057,8.426291 +10X_cells.CCTAAAGCAATCCAAC-L8TX_171026_01_G03,-5.1893587,11.6616535 +10X_cells.GATCGATTCAAGCCTA-L8TX_171026_01_G04,-4.9753227,12.811468 +10X_cells.TCACAAGCAATGGAAT-L8TX_171026_01_F04,-6.3256464,11.450107 +10X_cells.CCCATACTCTGTGCAA-L8TX_171026_01_C05,-3.5123122,7.842903 +10X_cells.TAAACCGAGGCCGAAT-L8TX_171026_01_G04,-6.9283147,12.068432 +10X_cells.AGTAGTCAGCGCCTCA-L8TX_171026_01_A04,-4.4441357,8.308989 +10X_cells.CAAGGCCGTTGAGGTG-L8TX_171026_01_E05,-5.8095007,11.280455 +10X_cells.CTGCGGAGTTACAGAA-L8TX_171026_01_B04,-5.3275604,9.950136 +10X_cells.CCTCTGATCTGCCCTA-L8TX_171026_01_B05,-4.7545276,10.907959 +10X_cells.GTGCAGCAGATCCTGT-L8TX_171026_01_A05,-6.624937,12.21308 +10X_cells.CTAAGACTCGATAGAA-L8TX_171026_01_C05,-4.4195647,10.402702 +10X_cells.CACATTTCACCACGTG-L8TX_171026_01_C05,-4.4833503,9.994539 +10X_cells.TCAGCAAAGCGTCTAT-L8TX_171026_01_H03,-6.2236714,12.697324 +10X_cells.TATCTCACATCCTTGC-L8TX_171026_01_F05,-5.376892,11.027569 +10X_cells.GGCTCGACACGGTGTC-L8TX_171026_01_F05,-6.9870796,12.969739 +10X_cells.CGTGAGCAGCTGTCTA-L8TX_171026_01_B05,-6.5205326,12.004189 +10X_cells.GAACGGAAGCCGGTAA-L8TX_171026_01_B04,-6.3433194,11.620121 +10X_cells.TCGCGAGCACGGCGTT-L8TX_171026_01_G03,-6.2738347,11.715203 +10X_cells.GCGCAACAGCTATGCT-L8TX_171026_01_G05,-4.83424,10.2958355 +10X_cells.ACCAGTAGTCGAATCT-L8TX_171026_01_B05,-4.369192,8.336325 +10X_cells.TCATTTGAGCTGCAAG-L8TX_171026_01_G04,-5.169395,11.019881 +10X_cells.GTCTTCGGTCAACTGT-L8TX_171026_01_H03,-4.344875,11.378464 +10X_cells.GAGGTGAAGGCTACGA-L8TX_171026_01_D05,-5.1708946,11.186258 +10X_cells.CATCGGGCACTCAGGC-L8TX_171026_01_G05,-6.3004756,11.537844 +10X_cells.AGCTCCTGTTACGACT-L8TX_171026_01_E05,-5.4375377,10.240729 +10X_cells.CCCAATCGTAACGCGA-L8TX_171026_01_G05,-1.365918,7.715475 +10X_cells.TGTATTCTCACTTACT-L8TX_171026_01_B04,-6.650327,13.450834 +10X_cells.CCTACACAGAGCTATA-L8TX_171026_01_G03,-4.7321906,10.003131 +10X_cells.CCCATACTCGGCCGAT-L8TX_171026_01_G04,-6.246211,11.352598 +10X_cells.ACTGTCCCATCGGAAG-L8TX_171026_01_G04,-4.7070065,9.866937 +10X_cells.CGAATGTGTCTGGAGA-L8TX_171026_01_F05,-5.902519,10.66859 +10X_cells.GCTGCAGAGTACGATA-L8TX_171026_01_G05,-6.204221,11.415768 +10X_cells.TCAGATGCATGACATC-L8TX_171026_01_H05,-3.1342034,8.072669 +Smartseq_cells.SM-DD442_S19_E1-50,-6.218094,11.96491 +Smartseq_cells.SM-GE92I_S266_E1-50,-6.2448015,11.943379 +Smartseq_cells.SM-GE92L_S166_E1-50,-6.658127,13.344854 +Smartseq_cells.SM-GE92L_S262_E1-50,-6.8944697,13.111243 +Smartseq_cells.SM-GE67N_S170_E1-50,-6.7013364,12.546995 +10X_cells.GTGCATACACATGACT-L8TX_180406_01_B01,0.028912708,8.270078 +10X_cells.TGACTTTGTCGAGATG-L8TX_180406_01_B01,-2.936788,11.847053 +10X_cells.TTTGTCATCTCGTTTA-L8TX_180406_01_E01,-1.4671994,10.026621 +10X_cells.TTGGCAAAGCAGCGTA-L8TX_180406_01_G01,-2.7747755,12.0337 +10X_cells.GTCCTCATCGGCGGTT-L8TX_180221_01_D10,8.6675625,16.623688 +10X_cells.ACTATCTAGTCGAGTG-L8TX_180221_01_D10,-5.840298,13.324511 +10X_cells.GGATTACGTTCGCGAC-L8TX_180221_01_D10,-3.9354234,10.01935 +10X_cells.CGGACGTAGTCACGCC-L8TX_180221_01_E10,-3.5237744,9.242383 +10X_cells.GCGCAGTCATTGGGCC-L8TX_180221_01_E10,-4.1911273,9.870122 +10X_cells.CGATGGCGTATAAACG-L8TX_180221_01_F10,-3.5645652,8.993604 +10X_cells.GACTGCGGTCATCCCT-L8TX_180221_01_H10,-6.2552524,13.747006 +10X_cells.ACACCCTTCACAGTAC-L8TX_180221_01_A11,-4.106329,9.77833 +10X_cells.CAGGTGCTCGAATGCT-L8TX_180221_01_A11,-4.0593553,9.665108 +10X_cells.TCAGGTAGTGGCTCCA-L8TX_190312_01_B02,-4.832335,9.739281 +10X_cells.CTGGTCTAGCTCCCAG-L8TX_190312_01_G02,-4.1893053,9.9554825 +10X_cells.TACTTGTGTTTGTGTG-L8TX_180907_01_B11,-4.4538507,11.198263 +10X_cells.GCGCAGTCAAGAGTCG-L8TX_180907_01_B11,-5.8594327,10.192255 +10X_cells.GGCTGGTCAGTCTTCC-L8TX_180907_01_B11,-3.8898184,8.816272 +10X_cells.TGACTAGCAATGGAAT-L8TX_180926_01_C12,-4.794063,9.758825 +10X_cells.CCTACCAGTACATGTC-L8TX_180926_01_E12,-3.0156262,8.277262 +10X_cells.TAGAGCTCAACGATGG-L8TX_181012_01_C05,-4.874743,10.095792 +10X_cells.CGAATGTAGTGACATA-L8TX_180221_01_B11,-7.70034,11.0914345 +10X_cells.TGGACGCCATCGACGC-L8TX_180221_01_D11,-5.575852,9.440659 +10X_cells.TGGCTGGCATGGTCAT-L8TX_180221_01_D11,-6.7558475,11.51631 +10X_cells.TTGACTTGTTGTCGCG-L8TX_180221_01_D11,-3.527549,11.691839 +10X_cells.AAGCCGCGTAATTGGA-L8TX_180221_01_E11,-6.1710052,9.615749 +10X_cells.ACGAGCCTCTGCCCTA-L8TX_180221_01_G11,-6.650936,11.524366 +10X_cells.GTCATTTTCTGCGACG-L8TX_180907_01_H11,-4.1902695,9.301163 +10X_cells.GGAATAACACCAGGCT-L8TX_180907_01_A12,-4.167233,8.874563 +10X_cells.CCTTACGTCATAGCAC-L8TX_180907_01_B12,-3.7187624,8.55997 +Smartseq_cells.SM-GE5US_S027_E1-50,-7.6123257,11.949951 +Smartseq_cells.SM-GE5US_S033_E1-50,-6.4505773,12.021784 +10X_cells.ACACTGAGTGTAACGG-L8TX_180926_01_B01,-4.128044,9.859202 +10X_cells.CAGCTAACATCACGTA-L8TX_180926_01_B01,-6.478992,12.528538 +10X_cells.TAGGCATTCTGCGGCA-L8TX_180926_01_B01,-4.202347,10.804763 +10X_cells.TTCTACACATTACGAC-L8TX_180926_01_B01,-5.488918,11.752385 +10X_cells.CTCACACGTTACGTCA-L8TX_180926_01_D01,-4.921275,11.007998 +10X_cells.GATCGATAGACAGACC-L8TX_180926_01_E01,-3.5036678,8.503977 +10X_cells.GGCTGGTAGTGGGCTA-L8TX_180926_01_E01,-4.895872,11.041447 +10X_cells.TACACGACACGACGAA-L8TX_180926_01_E01,-6.3527145,11.841171 +10X_cells.TACTTACAGTGGCACA-L8TX_180926_01_E01,-3.7661881,8.837842 +10X_cells.TTGGCAAAGCATCATC-L8TX_180926_01_E01,-5.7410088,13.708652 +10X_cells.ATAAGAGCAGCCAGAA-L8TX_180926_01_F01,-5.936321,12.347882 +10X_cells.CGTCCATGTACCTACA-L8TX_181011_01_A03,-4.007961,8.722517 +10X_cells.GGAATAAAGAAAGTGG-L8TX_181011_01_A03,-3.0297983,9.361498 +10X_cells.GGGAATGGTAGCGATG-L8TX_181011_01_A03,-3.8915894,8.953941 +10X_cells.TACGGTACATGCGCAC-L8TX_181011_01_A03,-5.2386193,11.119903 +10X_cells.TCTCATAAGAGTTGGC-L8TX_181011_01_A03,-3.7975056,8.889032 +10X_cells.CGATCGGTCATGCTCC-L8TX_181011_01_C03,-4.033953,9.291075 +10X_cells.TCAATCTAGGCCCTTG-L8TX_181011_01_C03,-6.9940133,13.317094 +10X_cells.CCCAATCTCCGCGCAA-L8TX_181011_01_H03,-3.5581057,11.615749 +10X_cells.TCTCTAAGTAAACGCG-L8TX_181011_01_H03,-3.5024261,8.884275 +10X_cells.TTTATGCCATATGAGA-L8TX_181011_01_H03,-5.393425,10.873406 +10X_cells.CAGAGAGGTTCAGCGC-L8TX_180712_01_E05,-5.947789,11.402109 +10X_cells.AGTGAGGCACACATGT-L8TX_180712_01_F05,0.4199296,7.5476036 +10X_cells.AGATTGCCATCTACGA-L8TX_180712_01_H05,-4.1073184,10.348816 +10X_cells.GGGAATGAGCTAAGAT-L8TX_180712_01_H05,-4.513691,10.617353 +10X_cells.AAGGTTCAGCAAATCA-L8TX_180712_01_A06,-3.2195294,10.672122 +10X_cells.ACACCGGTCTCGTATT-L8TX_180712_01_A06,-4.2511587,10.384922 +10X_cells.CTGATAGAGGCTCAGA-L8TX_180712_01_A06,-4.3746953,10.592058 +10X_cells.AAAGCAAAGTCGATAA-L8TX_180504_01_E01,-4.006699,9.196546 +10X_cells.AGTGTCAGTGTTCGAT-L8TX_180221_01_A12,-1.3486072,6.998753 +10X_cells.CGGGTCACAAACCTAC-L8TX_180221_01_A12,-1.9270467,7.280936 +10X_cells.GGACATTCATCACCCT-L8TX_180221_01_A12,-3.3895633,8.475848 +10X_cells.CTAGCCTTCGTAGGTT-L8TX_180221_01_C12,-2.4328744,7.402789 +10X_cells.CGTCAGGCATCGGAAG-L8TX_200611_02_A05,-5.6261683,11.289075 +10X_cells.GGGCATCAGCGTGAGT-L8TX_180115_01_C09,-6.999358,10.270904 +10X_cells.CGAACATGTCTAGCGC-L8TX_180115_01_B11,-5.8497295,11.095584 +10X_cells.GATGCTATCCTTCAAT-L8TX_180115_01_H10,-4.4960275,9.477862 +10X_cells.CTGCGGATCAGGTTCA-L8TX_180115_01_F11,-5.087423,11.439931 +10X_cells.CGGGTCACAAGCCATT-L8TX_180115_01_D11,-7.0761185,12.309069 +10X_cells.ACAGCCGAGATGTGTA-L8TX_180115_01_F09,-3.786673,7.804972 +10X_cells.GATGAAATCGTGGTCG-L8TX_180115_01_H10,-7.0823374,10.43109 +10X_cells.CTACACCTCCGAAGAG-L8TX_180115_01_C10,-3.8747232,8.021527 +10X_cells.GATTCAGGTATATCCG-L8TX_180115_01_E09,-6.264694,10.519155 +10X_cells.CATATTCGTGGCGAAT-L8TX_180115_01_C10,-3.8554509,8.603974 +10X_cells.GGGTCTGAGTATCTCG-L8TX_180115_01_F10,-5.8888245,9.4264345 +10X_cells.CGATCGGTCACAATGC-L8TX_180115_01_A11,-3.4452415,8.215352 +10X_cells.GCGCAGTGTCTCTTAT-L8TX_180115_01_F10,-6.840744,11.907238 +10X_cells.TCTCTAAGTCGAAAGC-L8TX_180115_01_G10,-2.572646,7.605045 +10X_cells.TCTGGAAAGCGATAGC-L8TX_180115_01_B10,-4.062291,8.2381935 +10X_cells.TCACGAAGTGGACGAT-L8TX_180115_01_F09,-6.0629883,10.952202 +10X_cells.TTCTCAATCGACAGCC-L8TX_180115_01_F10,-5.4958725,10.166456 +10X_cells.CGTCACTGTAGGGTAC-L8TX_180115_01_D11,-4.6073823,10.287445 +10X_cells.ATGCGATAGAGGTAGA-L8TX_180115_01_C09,-2.8419232,8.017844 +10X_cells.CCCAGTTGTCCGAACC-L8TX_180115_01_D10,-2.2807786,7.5408983 +10X_cells.TATCTCAGTGTTCGAT-L8TX_180115_01_H11,-3.3782938,9.8172655 +10X_cells.TGGCTGGTCTGGCGTG-L8TX_180115_01_F09,-4.5061827,9.392285 +10X_cells.CCTCTGATCTCGTATT-L8TX_180115_01_H11,-5.16326,12.102823 +10X_cells.TTTGTCACAAATCCGT-L8TX_180115_01_F11,-6.815634,12.163098 +10X_cells.ATCTACTCATTAGCCA-L8TX_180115_01_D11,-5.155804,11.840844 +10X_cells.AACCATGAGCTGCAAG-L8TX_180115_01_B09,-7.2356296,10.482398 +10X_cells.GTCACAATCCAAAGTC-L8TX_180115_01_E09,-4.985943,10.028281 +10X_cells.CATTCGCCATTAGGCT-L8TX_180115_01_A11,-6.4338365,12.237172 +10X_cells.GAGGTGAAGCGGCTTC-L8TX_180115_01_E11,-5.902057,11.958749 +10X_cells.TGACAACGTGCACTTA-L8TX_180115_01_C09,-6.4343853,12.049028 +10X_cells.GTAGGCCGTGAGGGTT-L8TX_180115_01_F10,-4.304806,8.571187 +10X_cells.GATCAGTCACATCCGG-L8TX_180115_01_A10,-3.8794842,8.346028 +10X_cells.CGAGAAGGTTTCCACC-L8TX_180115_01_B09,-5.8322644,11.872115 +10X_cells.GGTGAAGAGGATTCGG-L8TX_180115_01_G09,-4.3714366,8.4963665 +10X_cells.TAAGTGCCATGGTCTA-L8TX_180115_01_G11,-4.768081,11.016202 +10X_cells.CTGTTTAAGGAGCGTT-L8TX_180115_01_F10,-4.7359557,9.400425 +10X_cells.ATTTCTGTCTTGCAAG-L8TX_180115_01_D11,-6.4203,10.667406 +10X_cells.GCGAGAAGTAGGGTAC-L8TX_180115_01_F11,-3.797685,8.680563 +10X_cells.GATCTAGGTCTGGAGA-L8TX_180115_01_D11,-4.393231,11.875385 +10X_cells.GAGCAGACACTTAACG-L8TX_180115_01_C10,-5.907763,9.39193 +10X_cells.CATATTCAGAAAGTGG-L8TX_180115_01_B11,-7.343637,11.314388 +10X_cells.CTCACACTCGCCTGAG-L8TX_171120_01_G07,-3.8761764,10.40471 +10X_cells.GCGCCAAGTAGTACCT-L8TX_171120_01_G07,-5.24703,8.69244 +10X_cells.CGTGTAAAGCGCTCCA-L8TX_171120_01_H07,-5.238959,9.217472 +10X_cells.GTGGGTCAGGCCCTTG-L8TX_171120_01_H07,-4.2617283,9.765237 +10X_cells.TGCGCAGAGCTATGCT-L8TX_171120_01_H07,-5.860348,11.5644245 +10X_cells.TGGTTCCAGACTACAA-L8TX_171120_01_H07,-4.854444,10.830479 +10X_cells.ACGAGGACATGCCTTC-L8TX_180115_01_G08,-6.946852,13.043844 +10X_cells.GATGAAAAGCTAAGAT-L8TX_180115_01_G08,-4.4939656,10.478955 +10X_cells.TTTATGCGTACAGTTC-L8TX_180115_01_G08,-5.501127,11.761095 +10X_cells.ACACCCTCATTTCAGG-L8TX_171120_01_C07,-4.248245,11.792025 +10X_cells.ACTTTCACACATCCGG-L8TX_171120_01_D07,-4.5979147,10.89401 +10X_cells.GGTATTGTCGGAATCT-L8TX_171120_01_D07,-3.4475374,11.693455 +10X_cells.GTGCTTCAGGATGGTC-L8TX_171120_01_D07,-4.19483,9.942078 +10X_cells.TAGAGCTCAGATCGGA-L8TX_171120_01_D07,-6.9994435,10.678585 +10X_cells.TGGACGCCAAACCTAC-L8TX_171120_01_D07,-5.718903,12.008185 +10X_cells.TGGCTGGAGAATTCCC-L8TX_171120_01_D07,-6.5664988,12.639109 +10X_cells.TGTGGTAAGCTAGCCC-L8TX_171120_01_D07,-4.803613,11.048129 +10X_cells.AGAGCGAAGGTGTTAA-L8TX_171120_01_E07,-6.34077,9.823723 +10X_cells.CACACTCTCAGTACGT-L8TX_171120_01_E07,-4.6996217,10.795926 +10X_cells.CCTTCCCTCGAATCCA-L8TX_171120_01_E07,-3.9559953,11.397204 +10X_cells.CTCGGAGCACCAGATT-L8TX_171120_01_E07,-7.70225,11.1539955 +10X_cells.GGAATAAGTCATGCAT-L8TX_171120_01_E07,-6.253297,11.119945 +10X_cells.GTATTCTTCTGAGTGT-L8TX_171120_01_E07,-5.6605926,10.889611 +10X_cells.ATCGAGTTCAACGGGA-L8TX_171120_01_F07,-3.2208345,11.151253 +10X_cells.CCAGCGAGTTCTGAAC-L8TX_171120_01_F07,-7.2905774,10.879518 +10X_cells.CCTACACGTCTAGTCA-L8TX_171120_01_F07,-5.493194,11.817176 +10X_cells.CGACCTTAGGTGCTTT-L8TX_171120_01_F07,-3.7368026,11.838447 +10X_cells.GAACGGAGTATAGGTA-L8TX_171120_01_F07,-3.1979728,9.114295 +10X_cells.TGTCCCATCAGAAATG-L8TX_171120_01_F07,-5.2100773,9.467122 +10X_cells.TTTACTGCAGCTATTG-L8TX_171120_01_F07,-3.7737565,11.526966 +10X_cells.CAGTCCTAGTACATGA-L8TX_180115_01_F08,-7.3490486,12.943813 +10X_cells.CGGACGTCATCTCCCA-L8TX_180115_01_F08,-7.118246,12.723805 +10X_cells.CGTCTACAGGGCACTA-L8TX_180115_01_F08,-7.400506,12.792174 +10X_cells.CTTAGGATCTTAACCT-L8TX_180115_01_F08,-7.2721972,12.797565 +10X_cells.GGATTACTCGGGAGTA-L8TX_180115_01_C08,-5.392744,10.074675 +10X_cells.GGGTTGCAGTTTCCTT-L8TX_180115_01_C08,-5.4970045,11.161585 +10X_cells.AACCGCGTCTCTAAGG-L8TX_180115_01_E08,-6.178535,11.929093 +10X_cells.ACATACGTCATCGCTC-L8TX_180115_01_E08,-7.314169,12.995564 +10X_cells.CGGACACCAAGCTGGA-L8TX_180115_01_E08,-4.4110627,11.141221 +10X_cells.CTCGGAGAGCGTAATA-L8TX_180115_01_E08,-6.164349,12.013266 +10X_cells.TGAAAGAGTCACTTCC-L8TX_180115_01_E08,-6.7594504,13.101963 +Smartseq_cells.LS-14690_S70_E1-50,-6.9152274,11.437402 +Smartseq_cells.LS-15001_S36_E1-50,-6.712216,12.997253 +Smartseq_cells.LS-15001_S82_E1-50,-7.394401,12.239539 +Smartseq_cells.LS-15062_S57_E1-50,-6.910381,13.131508 +Smartseq_cells.LS-15305_S96_E1-50,-7.278053,12.192535 +Smartseq_cells.LS-15307_S83_E1-50,-6.819472,13.170918 +Smartseq_cells.LS-15356_S65_E3-50,-6.9177375,12.53136 +Smartseq_cells.LS-15356_S68_E3-50,-7.146332,12.505539 +10X_cells.ACTGTCCAGCCAGGAT-L8TX_180221_01_B10,-6.2385674,10.220096 +10X_cells.TCGTAGAAGAGTACCG-L8TX_180221_01_F09,-1.6295046,8.984651 +10X_cells.TTCCCAGCACAAGACG-L8TX_180221_01_F09,-2.6507769,8.744742 +10X_cells.CACAAACGTGTGACGA-L8TX_180221_01_G09,-4.3843765,10.755551 +10X_cells.TGGTTAGAGTAACCCT-L8TX_180221_01_G09,-3.1738644,11.629205 +10X_cells.ACGCAGCTCGTACGGC-L8TX_180221_01_A10,-3.557956,9.483796 +10X_cells.ATTATCCTCTGTCTAT-L8TX_180221_01_A10,-1.9211004,9.690567 +10X_cells.CAAGATCAGAATAGGG-L8TX_180221_01_A10,-0.87144506,13.301754 +10X_cells.CTGTTTAGTCTTTCAT-L8TX_180221_01_A10,-2.332752,11.881055 +10X_cells.AAGGTTCTCACCGGGT-L8TX_180221_01_B10,-2.2493339,9.601604 +10X_cells.CAGCAGCGTCATATCG-L8TX_180221_01_B10,-2.5469706,12.3763895 +10X_cells.CTAATGGTCAGCGATT-L8TX_180221_01_B10,-4.744238,8.923051 +10X_cells.GAATAAGTCCACGAAT-L8TX_180221_01_B10,-3.1912863,10.039775 +10X_cells.GACCTGGGTCAACTGT-L8TX_180221_01_B10,-2.5323396,8.032127 +10X_cells.TCCACACCAAGAGTCG-L8TX_180221_01_B10,-2.0638723,11.481045 +10X_cells.TCTTTCCCAACGATGG-L8TX_180221_01_B10,0.23657484,11.14592 +10X_cells.TGTGTTTTCGTGACAT-L8TX_180221_01_B10,-1.6152784,10.022428 +10X_cells.CACACAACAGCTCGCA-L8TX_180221_01_C10,-4.492299,9.573977 +10X_cells.CCGTGGAAGTGTTTGC-L8TX_180221_01_C10,-2.9944594,11.160616 +10X_cells.CGATCGGAGAAACCGC-L8TX_180221_01_C10,-3.1458158,11.143068 +10X_cells.GGCTCGAGTCAATGTC-L8TX_180221_01_C10,-1.4121097,9.4273 +10X_cells.GGGTCTGCAGGGTACA-L8TX_180221_01_C10,-6.040288,10.953352 +10X_cells.TATTACCCAGTGGGAT-L8TX_180221_01_C10,-2.6922789,10.764034 +10X_cells.TCTCTAAAGCCCGAAA-L8TX_180221_01_C10,-2.1810083,12.193832 +10X_cells.AGCCTAAAGGAACTGC-L8TX_180406_01_F02,-0.8261762,11.390124 +10X_cells.AGCTCCTCACCGAAAG-L8TX_180406_01_F02,-0.37865552,9.196544 +10X_cells.ATGGGAGAGCCACCTG-L8TX_180406_01_F02,-2.1490366,9.089768 +10X_cells.CCTTCCCCAGACGCAA-L8TX_180406_01_F02,-1.1370547,9.796395 +10X_cells.CGGTTAACATCACAAC-L8TX_180406_01_F02,-1.3653725,8.524436 +10X_cells.TACAGTGGTTGATTCG-L8TX_180406_01_F02,-2.4191816,9.241293 +10X_cells.TGGTTAGCAGTATCTG-L8TX_180406_01_F02,-2.735748,8.960585 +10X_cells.ACGAGGAGTTCGGGCT-L8TX_180406_01_C06,-0.94381595,8.399563 +10X_cells.CGATGGCAGCTGGAAC-L8TX_180406_01_C06,-1.3439194,7.6133847 +10X_cells.TAGTTGGGTCCGCTGA-L8TX_180406_01_C06,-4.330984,9.036845 +Smartseq_cells.SM-DD45T_S026_E1-50,-3.1988015,13.024095 +Smartseq_cells.SM-DD45T_S117_E1-50,-3.2360144,12.712432 +Smartseq_cells.SM-GE67T_S358_E1-50,-4.472082,13.652586 +Smartseq_cells.SM-GE67T_S360_E1-50,-4.3990774,12.617055 +10X_cells.CGTCTACCATCGACGC-L8TX_180712_01_G05,-1.3606572,8.266883 +10X_cells.CATTCGCAGCGCTTAT-L8TX_180607_01_C05,-0.40053645,9.386085 +10X_cells.TACGGGCAGGGTATCG-L8TX_180607_01_C05,-4.192314,8.499772 +10X_cells.ACTGCTCAGCAATCTC-L8TX_180712_01_C06,-3.9719467,8.441319 +10X_cells.AGAGCGAAGATCGATA-L8TX_180221_01_D09,-0.7459382,7.196921 +10X_cells.ATTATCCTCAATACCG-L8TX_180221_01_E09,-3.6040893,9.836981 +10X_cells.TGCGTGGCACCGCTAG-L8TX_180221_01_D09,-4.9770503,12.517474 +10X_cells.TACCTATCATGCCCGA-L8TX_180712_01_B06,-5.086948,10.622463 +10X_cells.CTACATTTCAGCTGGC-L8TX_180221_01_E09,-1.7071563,8.243624 +10X_cells.AGATTGCTCCAGAGGA-L8TX_180221_01_H12,-2.8077376,9.687488 +10X_cells.TCGCGAGAGAGGTTGC-L8TX_180712_01_B06,1.1094214,7.5112004 +10X_cells.CATCGAATCGACCAGC-L8TX_180221_01_E09,-1.047423,10.511352 +10X_cells.GTCTTCGGTCTAACGT-L8TX_180712_01_G05,-3.1605964,9.295472 +10X_cells.CGGAGTCAGCAGACTG-L8TX_180221_01_D09,-1.9735234,12.172818 +10X_cells.TATTACCAGGCCATAG-L8TX_180712_01_B06,-4.096225,10.608342 +10X_cells.CTACACCTCGTTGACA-L8TX_180712_01_C06,-2.7649674,9.403825 +10X_cells.TTGACTTCAACACGCC-L8TX_180221_01_H12,-2.8985767,8.580935 +10X_cells.GGCGACTTCTCAACTT-L8TX_180712_01_G05,-2.9907446,9.533687 +10X_cells.GTACTTTCAGTTCCCT-L8TX_180221_01_E09,-2.8180547,10.295986 +10X_cells.GATCGATTCTCTAAGG-L8TX_180221_01_E09,-3.544834,9.337681 +10X_cells.GGTGTTAAGCCTTGAT-L8TX_180712_01_C06,-2.9323514,8.86816 +10X_cells.CGAGCCATCGTACCGG-L8TX_180712_01_C06,-2.9902816,8.405456 +10X_cells.GCTCTGTCACCTCGTT-L8TX_180221_01_D09,-0.5591084,8.951277 +10X_cells.GCTGCAGCAGATCCAT-L8TX_180712_01_B06,-2.9391968,9.137168 +10X_cells.GAACATCTCATTCACT-L8TX_180221_01_C09,-2.4800541,8.505045 +10X_cells.AACTCAGCATCTGGTA-L8TX_180607_01_C05,-2.848117,8.534006 +10X_cells.CACCTTGTCAGGCGAA-L8TX_180221_01_E09,-2.9193296,11.125868 +10X_cells.GTACTTTGTAAGCACG-L8TX_180712_01_B06,-3.5702982,9.256892 +10X_cells.TACTTACGTACTTCTT-L8TX_180221_01_E09,-3.7842739,9.453044 +10X_cells.CAAGTTGAGGGTGTGT-L8TX_180712_01_B06,-1.7906826,7.4486885 +10X_cells.GAATGAATCGGTTCGG-L8TX_180712_01_G05,0.5358337,11.380561 +10X_cells.ACTTTCATCTCTGTCG-L8TX_180607_01_C05,-2.8665524,10.534206 +10X_cells.TATCAGGAGCCACTAT-L8TX_180221_01_D09,-3.2875373,8.301682 +10X_cells.TACTTGTCACAGGAGT-L8TX_180221_01_E09,-5.430367,11.4369135 +10X_cells.AGTGAGGCAATCACAC-L8TX_180607_01_C05,-2.9018044,9.464739 +10X_cells.TACGGGCTCTCCAACC-L8TX_180712_01_G05,-4.1696434,10.541226 +10X_cells.CAAGAAAAGCTTCGCG-L8TX_180221_01_E09,-4.351585,9.856044 +10X_cells.CCAATCCCAGTCGATT-L8TX_180712_01_B06,-1.4993365,8.347424 +10X_cells.AGGGAGTAGAAACCGC-L8TX_180221_01_E09,-5.7124104,10.106056 +10X_cells.TTTGGTTCAATGCCAT-L8TX_180221_01_C09,-0.22093856,8.990224 +10X_cells.GCGCAACTCATGTAGC-L8TX_180712_01_G05,-2.0412364,10.142195 +10X_cells.TTCTCCTCAGGAACGT-L8TX_180712_01_G05,-2.1249928,7.8074594 +10X_cells.TCTGAGAAGTCCTCCT-L8TX_180712_01_B06,-3.6337101,9.85395 +Smartseq_cells.SM-GE67M_S341_E1-50,-5.0702577,12.946139 +Smartseq_cells.SM-GE679_S002_E1-50,-3.6446912,12.212805 +Smartseq_cells.LS-15023_S44_E1-50,-6.8706574,12.595705 +Smartseq_cells.LS-15023_S47_E1-50,-6.077275,12.542346 +Smartseq_cells.LS-15047_S13_E1-50,-6.2235117,12.888107 +Smartseq_cells.LS-15047_S61_E1-50,-5.011253,13.293746 +Smartseq_cells.LS-15047_S84_E1-50,-5.479375,12.801455 +Smartseq_cells.LS-15087_S74_E1-50,-5.8333817,12.641598 +Smartseq_cells.LS-15087_S82_E1-50,-6.9506946,12.706235 +Smartseq_cells.LS-15305_S45_E1-50,-4.1707077,13.594998 +Smartseq_cells.LS-15305_S78_E1-50,-3.5099597,14.176819 +Smartseq_cells.LS-15310_S61_E2-50,-3.9876032,14.335395 +Smartseq_cells.LS-15312_S40_E2-50,-5.5539265,13.230099 +Smartseq_cells.LS-15322_S42_E2-50,-5.663409,12.310768 +Smartseq_cells.LS-15338_S49_E1-50,-4.7010036,12.850169 +Smartseq_cells.LS-15339_S23_E1-50,-4.800505,13.975291 +Smartseq_cells.LS-15339_S25_E1-50,-4.4381456,14.248846 +Smartseq_cells.LS-15344_S31_E1-50,-5.441824,13.017256 +Smartseq_cells.LS-15345_S85_E1-50,-4.811655,14.000239 +Smartseq_cells.SM-D9EPG_S36_E1-50,-4.4766383,13.648873 +Smartseq_cells.SM-D9EPH_S43_E1-50,-4.959948,13.234772 +Smartseq_cells.SM-D9EPH_S50_E1-50,-4.1970854,13.748198 +Smartseq_cells.SM-D9EPH_S93_E1-50,-6.3818746,12.672042 +Smartseq_cells.SM-D9D13_S59_E1-50,-4.4261093,13.027648 +Smartseq_cells.SM-D9D13_S90_E1-50,-3.7454937,14.470166 +Smartseq_cells.SM-D9D14_S77_E1-50,-3.562016,11.553311 +Smartseq_cells.SM-D9D14_S81_E1-50,-4.325624,13.723811 +Smartseq_cells.SM-D9D7N_S37_E1-50,-5.268227,12.811178 +Smartseq_cells.SM-D9D7N_S38_E1-50,-4.065744,14.692349 +Smartseq_cells.SM-D9D7O_S20_E1-50,-5.2789683,12.881999 +Smartseq_cells.SM-D9D7P_S36_E1-50,-5.2263865,11.209271 +Smartseq_cells.SM-D9D7P_S46_E1-50,-6.3967066,12.641947 +Smartseq_cells.SM-GE65A_S061_E1-50,-3.3853388,13.310855 +Smartseq_cells.SM-GE65A_S064_E1-50,-4.5086827,13.049431 +Smartseq_cells.SM-GE65A_S145_E1-50,-5.4738846,12.926191 +Smartseq_cells.SM-GE65Z_S186_E1-50,-4.313639,12.582061 +10X_cells.CACCAGGAGCTATGCT-L8TX_180829_01_D09,-3.4252942,9.193274 +10X_cells.CGAACATGTGACTACT-L8TX_180829_01_D09,-1.0733565,9.195379 +10X_cells.GGCCGATTCCGAACGC-L8TX_180829_01_D09,-4.0808344,9.001795 +10X_cells.GTCCTCACATCCGCGA-L8TX_180829_01_D09,-3.9666364,9.5894375 +10X_cells.CTAATGGTCGACAGCC-L8TX_180829_01_D10,-3.4376755,9.576807 +10X_cells.GACGCGTCATTCTTAC-L8TX_180829_01_D10,-2.9444761,7.5566964 +10X_cells.TTGCGTCTCTGCTGCT-L8TX_180829_01_E10,-4.782927,10.743617 +10X_cells.ACACCGGCAAGTAATG-L8TX_180907_01_F10,-2.4995952,10.710442 +10X_cells.CCACCTATCGTACCGG-L8TX_180907_01_F10,-3.711782,10.150473 +10X_cells.CGAGCACCAAAGGCGT-L8TX_180907_01_F10,-4.7905746,10.807755 +10X_cells.GCGCAACAGCCCAACC-L8TX_180907_01_F10,-3.9196007,9.265932 +10X_cells.TAAGCGTCATTTCACT-L8TX_180907_01_G10,-3.2691042,10.171937 +10X_cells.TGGCTGGGTACATCCA-L8TX_180907_01_G10,-1.8233732,9.43185 +10X_cells.AGCAGCCAGAATTCCC-L8TX_181011_01_G02,-3.2105641,10.341722 +10X_cells.CGTAGCGTCTAACTGG-L8TX_181011_01_G02,-1.800721,9.577986 +10X_cells.CTAGAGTTCCTGTAGA-L8TX_181011_01_G02,-3.311575,10.427025 +10X_cells.GTTCGGGGTGTGAATA-L8TX_181011_01_G02,-2.5885475,12.691777 +10X_cells.TCTGAGAGTGATGTCT-L8TX_181011_01_G02,0.4722607,8.526276 +10X_cells.TGCCCATCATGACGGA-L8TX_181011_01_G02,-2.1667166,8.197025 +10X_cells.CAGTAACGTATCAGTC-L8TX_181011_01_C04,-2.048954,8.417867 +10X_cells.CCTCAGTCACGAAGCA-L8TX_181011_01_C04,-3.0394766,8.049579 +10X_cells.CTCACACGTCACTTCC-L8TX_181011_01_C04,-2.657522,11.736515 +10X_cells.GTCATTTCATTCCTCG-L8TX_181011_01_C04,-2.5647829,7.7432947 +10X_cells.ACGAGCCGTCTGCCAG-L8TX_181012_01_G04,-2.3314178,7.5917177 +10X_cells.AGCGTCGCAGTCAGCC-L8TX_181012_01_G04,-3.2761636,7.8518715 +10X_cells.CTGCTGTTCAGCTGGC-L8TX_181012_01_G04,-3.5104322,8.58711 +10X_cells.GCATGATAGTACGCCC-L8TX_181012_01_G04,-5.606813,11.159635 +10X_cells.GCTGCGACAGCATGAG-L8TX_181012_01_G04,-4.1177883,9.373686 +10X_cells.GTGCTTCGTTATTCTC-L8TX_181012_01_G04,-2.0912971,8.134142 +10X_cells.TCGGTAAAGCCAGTAG-L8TX_181012_01_G04,-2.8397863,8.69234 +10X_cells.CTACACCAGTCGTTTG-L8TX_181012_01_H04,-2.636751,9.051524 +10X_cells.GATCAGTCATTAGGCT-L8TX_181012_01_H04,-2.0799944,8.395686 +10X_cells.TGACGGCTCCTTTCTC-L8TX_181012_01_H04,-2.955876,11.209246 +10X_cells.TCCACACCATCTCGCT-L8TX_181012_01_E05,-3.708418,10.147346 +10X_cells.TCTATTGGTCAACATC-L8TX_181012_01_E05,-1.7049187,8.758253 +Smartseq_cells.SM-GE5VH_S283_E1-50,-4.7515864,12.4312 +Smartseq_cells.SM-GE5VC_S014_E1-50,-5.793714,12.966951 +10X_cells.CGCTTCAAGGCAGTCA-L8TX_180406_01_H01,-0.2377326,8.09348 +10X_cells.GCATGATCACATAACC-L8TX_180406_01_H01,-1.6797831,8.530807 +10X_cells.CTGATAGCATGGGAAC-L8TX_180406_01_G02,-0.07066232,7.816872 +10X_cells.GTCCTCACATGGTAGG-L8TX_180406_01_G02,-0.9171131,9.081893 +10X_cells.CAAGGCCGTTCTCATT-L8TX_180406_01_H02,-1.1517166,9.119934 +10X_cells.CGTCACTCACCAGATT-L8TX_180406_01_H02,-0.22574316,8.849422 +10X_cells.GGGAGATAGCCGGTAA-L8TX_180406_01_H02,-1.0818516,8.741207 +10X_cells.TGGCCAGGTATATCCG-L8TX_180406_01_B06,1.400011,8.242819 +10X_cells.AGCCTAAAGGGATACC-L8TX_180406_01_E06,0.7857567,7.6850767 +10X_cells.CAACTAGTCCCTAACC-L8TX_180406_01_E06,-0.6849286,8.955122 +10X_cells.ACGGGTCTCAGCAACT-L8TX_180406_01_E07,-3.4078748,7.4100018 +10X_cells.GGGCATCTCCGTAGTA-L8TX_180406_01_E07,-0.36793074,8.018749 +Smartseq_cells.SM-GE5VD_S079_E1-50,-6.194289,12.780155 +10X_cells.ACATCAGTCGCCTGTT-L8TX_171026_01_F05,-0.18381067,9.941847 +10X_cells.GGGCATCGTACCGAGA-L8TX_171026_01_B04,-2.2311394,9.135238 +10X_cells.CTTCTCTAGTGCCATT-L8TX_171026_01_H03,-4.2566957,12.255894 +10X_cells.ACATCAGGTTCCACAA-L8TX_171026_01_A05,-2.1357856,11.432204 +10X_cells.CGTGAGCGTGTTCTTT-L8TX_171026_01_A05,-3.3484101,13.370013 +10X_cells.CGCTTCAAGTGTGAAT-L8TX_171026_01_H05,-4.0826354,10.919155 +10X_cells.CAGAATCTCGCAAACT-L8TX_171026_01_F04,-3.107,9.245034 +10X_cells.TCAGCTCAGACGCAAC-L8TX_171026_01_D05,-5.162035,11.553996 +10X_cells.ATAGACCGTCACACGC-L8TX_171026_01_G04,-5.280149,10.578028 +10X_cells.CCTTACGAGGCACATG-L8TX_171026_01_F04,-0.19991654,10.719131 +10X_cells.AAAGTAGGTCTAGAGG-L8TX_171026_01_D05,-2.5627856,8.769035 +10X_cells.GATGAAATCTGACCTC-L8TX_171026_01_D05,-2.4434228,10.621437 +10X_cells.TCGAGGCAGGAACTGC-L8TX_171026_01_H03,-2.9314601,9.054955 +10X_cells.AAAGATGGTTTAGGAA-L8TX_171026_01_H05,-3.0944743,8.789012 +10X_cells.CGCTGGAAGTGGACGT-L8TX_171026_01_B05,-5.0493774,10.954377 +10X_cells.GGAGCAAGTTATTCTC-L8TX_171026_01_E05,-5.7840867,12.859989 +10X_cells.ATGCGATCAGCAGTTT-L8TX_171026_01_H04,-5.132281,8.425538 +10X_cells.TTTCCTCCACATGGGA-L8TX_171026_01_F04,-2.9407775,11.051776 +10X_cells.TCGAGGCAGCAGCGTA-L8TX_171026_01_F04,-2.5499454,10.526631 +10X_cells.TACTTACAGTGAACGC-L8TX_171026_01_H03,-2.8668537,9.173185 +10X_cells.ACTGATGCAGTCTTCC-L8TX_171026_01_G04,-3.8492324,11.535814 +10X_cells.AGCGTATGTTTGACTG-L8TX_171026_01_G03,-3.8943787,10.119652 +10X_cells.GGCCGATTCCCTCTTT-L8TX_171026_01_B04,-2.292416,12.990759 +10X_cells.TCTTTCCCACCTATCC-L8TX_171026_01_A05,-3.9784884,10.572328 +10X_cells.TACTCGCTCGTACGGC-L8TX_171026_01_A05,-2.8266916,11.2065 +10X_cells.TTTATGCTCACTTACT-L8TX_171026_01_G03,-1.8454378,10.835616 +10X_cells.CAAGATCTCACTTCAT-L8TX_171026_01_G05,-3.2593331,12.057493 +10X_cells.GGACATTGTACTTGAC-L8TX_171026_01_A04,-2.584284,10.529519 +10X_cells.AAGGCAGAGATACACA-L8TX_171026_01_F04,-2.4381878,10.633166 +10X_cells.ATTGGACAGTCGCCGT-L8TX_171026_01_G03,-3.7696023,10.02934 +10X_cells.TGACTAGGTGGTACAG-L8TX_171026_01_A04,-0.33499685,8.369002 +10X_cells.CATTCGCAGTGGTCCC-L8TX_171026_01_F04,-1.3846686,12.270791 +10X_cells.TTGAACGCACCTTGTC-L8TX_171026_01_H03,-1.9797094,9.840641 +10X_cells.TTCTCCTAGGCATGTG-L8TX_171026_01_F03,-2.1641715,10.074847 +10X_cells.CCATTCGCACGAGGTA-L8TX_171026_01_E05,-4.318426,10.470158 +10X_cells.AACCATGCAAGACGTG-L8TX_171026_01_B04,-3.6072617,10.22757 +10X_cells.CTCGAGGCAAAGTCAA-L8TX_171026_01_E05,-2.9952624,10.463709 +10X_cells.AAATGCCAGAGACTAT-L8TX_171026_01_B04,-2.5831988,10.9094515 +10X_cells.CCTTCGATCACAACGT-L8TX_171026_01_F04,-6.3597293,11.225847 +10X_cells.TGACTTTTCTACCTGC-L8TX_171026_01_B05,-3.3325303,11.801371 +10X_cells.GTTACAGCAAGCTGTT-L8TX_171026_01_H03,-2.8364835,9.434984 +10X_cells.GATCGATCACGTCTCT-L8TX_171026_01_H05,-3.5607448,10.960398 +10X_cells.CGATGGCGTTTAAGCC-L8TX_171026_01_H03,-5.916582,10.155356 +10X_cells.GTCAAGTCAATGGACG-L8TX_171026_01_F04,-1.9265652,12.754762 +10X_cells.TCGTACCAGCTAGTTC-L8TX_171026_01_B04,-2.3737328,11.359365 +10X_cells.CGGACACCATGAACCT-L8TX_171026_01_C05,-4.377008,11.095791 +10X_cells.CCAGCGACACAGGCCT-L8TX_171026_01_C05,-2.605853,9.462756 +10X_cells.TCTGGAACAAAGGTGC-L8TX_171026_01_C05,-2.1585796,7.7814674 +10X_cells.CATCAAGAGTGGACGT-L8TX_171026_01_G04,-4.1459503,10.647294 +10X_cells.TATCTCATCCATGCTC-L8TX_171026_01_H04,-3.516265,12.359498 +10X_cells.GTAGGCCCACGTAAGG-L8TX_171026_01_G03,-3.7816403,12.215539 +10X_cells.TCTCATACACAACGCC-L8TX_171026_01_H03,-2.2126412,8.5804205 +10X_cells.GCATGTATCTGCGGCA-L8TX_171026_01_G05,-3.545924,9.7448 +10X_cells.GCGCAGTCAACTTGAC-L8TX_171026_01_G04,-5.3331084,12.153719 +10X_cells.CTCAGAAAGCCCAACC-L8TX_171026_01_F03,-4.17485,10.7107935 +10X_cells.ACCGTAACATCGACGC-L8TX_171026_01_F04,-4.201698,11.297633 +10X_cells.GCTCCTAGTGTAAGTA-L8TX_171026_01_B05,-3.4771762,10.865036 +10X_cells.ATGTGTGAGGCAATTA-L8TX_171026_01_A05,-4.0353537,9.382151 +10X_cells.CCCAGTTGTGTGAATA-L8TX_171026_01_B05,-2.9066076,9.17915 +10X_cells.ACCGTAATCGTGGTCG-L8TX_171026_01_F05,-2.2618592,9.169082 +10X_cells.TCTATTGTCAGGTTCA-L8TX_171026_01_F04,-5.4568663,11.361472 +10X_cells.GATCGATCAGGAATCG-L8TX_171026_01_G03,-3.0280783,10.592702 +10X_cells.CAGCTAATCGAGCCCA-L8TX_171026_01_A04,-3.5487013,12.173855 +10X_cells.CACAAACCATGCCACG-L8TX_171026_01_F05,-2.7695045,8.905845 +Smartseq_cells.SM-GE67S_S025_E1-50,-5.7935786,11.920064 +Smartseq_cells.SM-GE67S_S031_E1-50,-6.2970343,12.702419 +Smartseq_cells.SM-GE67S_S037_E1-50,-3.50327,13.794362 +Smartseq_cells.SM-GE67S_S047_E1-50,-4.616025,13.809765 +Smartseq_cells.SM-GE67S_S058_E1-50,-3.2484827,13.657463 +Smartseq_cells.SM-GE92H_S051_E1-50,-5.5628867,11.83385 +Smartseq_cells.SM-GE92H_S103_E1-50,-6.440863,11.747841 +Smartseq_cells.SM-GE92I_S265_E1-50,-6.0564313,12.35906 +Smartseq_cells.SM-GE92I_S340_E1-50,-4.936214,12.04707 +Smartseq_cells.SM-GE92I_S349_E1-50,-5.944382,12.855003 +Smartseq_cells.SM-GE92I_S358_E1-50,-5.238634,11.301528 +Smartseq_cells.SM-GE92I_S361_E1-50,-6.8743706,12.505829 +Smartseq_cells.SM-GE92L_S044_E1-50,-5.5959325,12.114378 +Smartseq_cells.SM-GE92L_S144_E1-50,-3.392939,13.82784 +Smartseq_cells.SM-GE92L_S272_E1-50,-5.424509,12.943294 +Smartseq_cells.SM-GE92L_S275_E1-50,-5.3711853,13.108957 +10X_cells.CGTGTCTCAGATAATG-L8TX_181206_01_H11,-2.2156832,9.4938135 +10X_cells.TTGGAACTCGTACGGC-L8TX_181206_01_H11,-3.8801188,11.320572 +10X_cells.TTGTAGGTCTCTAAGG-L8TX_181206_01_H11,-4.0992217,9.360488 +10X_cells.CACAGTACAGTCGATT-L8TX_181206_01_A12,-2.0476534,10.668275 +10X_cells.CGACTTCTCCTGCTTG-L8TX_181206_01_A12,-0.6945849,10.657582 +10X_cells.TCCCGATAGAGGTACC-L8TX_181206_01_A12,-1.5456501,9.347152 +10X_cells.CTCGAGGTCCACGCAG-L8TX_181206_01_B12,-3.0134501,8.924015 +10X_cells.GGGAGATAGAAACGCC-L8TX_181206_01_D12,-3.0611322,9.219588 +10X_cells.CTAAGACAGTTTAGGA-L8TX_180406_01_C01,0.81745,8.307221 +10X_cells.TGTTCCGTCGGTCCGA-L8TX_180406_01_C01,-1.0220579,9.194329 +10X_cells.TAAGAGACAGGCAGTA-L8TX_180406_01_F01,-0.7707117,9.201484 +10X_cells.CGAGAAGTCTGGAGCC-L8TX_180406_01_G01,0.47783354,8.263439 +10X_cells.ATAAGAGGTGTCCTCT-L8TX_180406_01_B02,-0.40772018,8.553531 +Smartseq_cells.SM-GE66Z_S288_E1-50,-3.742263,12.46171 +Smartseq_cells.SM-GE671_S252_E1-50,-2.6378205,13.989643 +10X_cells.CAGCTGGTCTCAACTT-L8TX_180221_01_D10,-3.5831897,10.880912 +10X_cells.ACGGCCAGTGCCTGCA-L8TX_180221_01_D10,-4.041797,9.357355 +10X_cells.CGCCAAGCAAACCTAC-L8TX_180221_01_D10,-3.469789,11.139546 +10X_cells.CTAGCCTAGTGAAGTT-L8TX_180221_01_D10,-2.407395,10.036569 +10X_cells.AAACCTGGTATGAAAC-L8TX_180221_01_E10,-1.189677,9.141672 +10X_cells.ATCCGAATCCGCAGTG-L8TX_180221_01_E10,-2.5892808,11.464266 +10X_cells.CAGCATAGTACCCAAT-L8TX_180221_01_E10,-3.328702,10.120659 +10X_cells.CCCAATCTCCACGACG-L8TX_180221_01_E10,-2.2924051,9.827876 +10X_cells.CCGTTCACAGGTCGTC-L8TX_180221_01_E10,-0.569348,11.5329275 +10X_cells.CGTAGCGGTAGGGACT-L8TX_180221_01_E10,0.6721319,11.412205 +10X_cells.GTCGGGTAGCGTAGTG-L8TX_180221_01_E10,-2.963383,8.57019 +10X_cells.GTTCTCGGTCAAAGCG-L8TX_180221_01_E10,-4.9081106,10.835657 +10X_cells.TTTGCGCCATACTCTT-L8TX_180221_01_E10,-3.4095454,12.340997 +10X_cells.ACTGCTCGTTGCGCAC-L8TX_180221_01_F10,-2.388567,9.154265 +10X_cells.AGTGGGAAGCAGCGTA-L8TX_180221_01_F10,-2.4689043,11.303402 +10X_cells.CATTCGCAGAATTGTG-L8TX_180221_01_F10,-4.853735,10.925393 +10X_cells.GTCACGGAGTGCGTGA-L8TX_180221_01_F10,-0.088988185,10.780032 +10X_cells.TAAGCGTCAATGGACG-L8TX_180221_01_F10,0.005960514,7.884258 +10X_cells.TACTTACGTGACTCAT-L8TX_180221_01_F10,-2.9634295,8.3953 +10X_cells.TGAGCATGTAAGTAGT-L8TX_180221_01_F10,-1.2836522,8.641273 +10X_cells.AGACGTTGTCAAAGAT-L8TX_180221_01_G10,-2.2017004,9.052307 +10X_cells.AAAGATGCATCATCCC-L8TX_180221_01_H10,-0.6730346,8.806173 +10X_cells.ACTGAACAGACTCGGA-L8TX_180221_01_A11,-2.9967911,9.344507 +10X_cells.ATAACGCGTCACCTAA-L8TX_180221_01_A11,-0.5560004,9.9177685 +10X_cells.CCGGGATGTGGCGAAT-L8TX_180221_01_A11,-3.993861,10.618598 +10X_cells.GGACGTCGTCAGGACA-L8TX_180221_01_A11,-2.8113601,9.787961 +10X_cells.ACAGCCGTCGACGGAA-L8TX_190312_01_B02,-4.3034163,9.09335 +10X_cells.ACGGAGACACCAGCAC-L8TX_190312_01_B02,-1.9466995,9.235998 +10X_cells.AGACGTTGTTTAAGCC-L8TX_190312_01_B02,-3.9576645,9.883472 +10X_cells.GTGCGGTTCACGAAGG-L8TX_190312_01_B02,-3.236815,8.464867 +10X_cells.TCAACGAAGTGTACTC-L8TX_190312_01_B02,-3.1161737,7.8855715 +10X_cells.ACTTACTCACTGAAGG-L8TX_190312_01_C02,-0.36674374,8.710589 +10X_cells.GGTGAAGAGTAGATGT-L8TX_190312_01_C02,-1.9919689,10.09875 +10X_cells.TTCTTAGTCCACGAAT-L8TX_190312_01_C02,-2.012134,9.210453 +10X_cells.AGCTTGAGTCCCGACA-L8TX_190312_01_D02,-3.1721158,8.5287695 +10X_cells.CACCAGGTCAGCCTAA-L8TX_190312_01_D02,-3.0544672,11.202892 +10X_cells.CTTGGCTGTGCAGTAG-L8TX_190312_01_D02,-2.960926,9.6846075 +10X_cells.GTTTCTACAAAGTGCG-L8TX_190312_01_G02,-1.1239524,7.5112805 +10X_cells.AGTAGTCGTAAGGGCT-L8TX_180907_01_B11,-2.7863913,8.853337 +10X_cells.AGTTGGTTCGGATGTT-L8TX_180907_01_B11,-2.678611,7.6118264 +10X_cells.TCAACGAAGTCATGCT-L8TX_180907_01_B11,-4.0777903,9.67376 +10X_cells.AAATGCCTCCCATTTA-L8TX_180926_01_C12,-4.0687447,10.706918 +10X_cells.ACTGTCCAGTAGGCCA-L8TX_180926_01_C12,-2.0186024,9.466123 +10X_cells.GTGCAGCTCTGCGTAA-L8TX_180926_01_C12,-2.1632771,12.931856 +10X_cells.AGGTCATTCTTTAGGG-L8TX_180926_01_E12,-1.8323606,8.909678 +10X_cells.GCGCAACGTCTTGTCC-L8TX_180926_01_E12,-2.222193,10.545774 +10X_cells.TAAGAGAGTACTCGCG-L8TX_180926_01_E12,-5.2780786,10.699617 +10X_cells.AGTGAGGCAGGAATGC-L8TX_181012_01_B05,-3.9970763,9.321685 +10X_cells.GATCGTATCAGTCCCT-L8TX_181012_01_B05,-3.0512106,9.430073 +10X_cells.GCATGTACACCTGGTG-L8TX_181012_01_B05,-2.5740523,8.505309 +Smartseq_cells.SM-GE8XM_S103_E1-50,-6.791857,12.546993 +10X_cells.GGAAAGCCAGCCTTTC-L8TX_180221_01_B11,-1.3750849,6.9864535 +10X_cells.ACGATGTGTTCGTTGA-L8TX_180221_01_C11,-5.501028,10.544171 +10X_cells.CTGGTCTTCTCTGCTG-L8TX_180221_01_C11,-2.7313404,9.485472 +10X_cells.GACTGCGCAAGGTTTC-L8TX_180221_01_C11,-1.8199587,11.749755 +10X_cells.TGTCCCATCGCGTTTC-L8TX_180221_01_C11,-0.3559215,8.275356 +10X_cells.CAGCCGATCACCGGGT-L8TX_180221_01_D11,-0.953443,9.263578 +10X_cells.CCTACACTCATGCATG-L8TX_180221_01_D11,-3.0074768,10.899927 +10X_cells.CTCGTACAGGACAGAA-L8TX_180221_01_D11,-3.9160836,8.479827 +10X_cells.ATGAGGGGTAGCTAAA-L8TX_180221_01_E11,-2.1582334,7.3034515 +10X_cells.GTCACAACAGTAAGCG-L8TX_180221_01_E11,-3.544532,8.330098 +10X_cells.TACTTGTGTCCAAGTT-L8TX_180221_01_E11,-0.24892153,8.559588 +10X_cells.CTCGTACAGTGGTCCC-L8TX_180221_01_F11,-0.19139946,9.411584 +Smartseq_cells.SM-GE67O_S281_E1-50,-4.88421,13.385629 +Smartseq_cells.SM-GE67Q_S147_E1-50,-3.1969848,13.543226 +Smartseq_cells.SM-GE67Q_S234_E1-50,-4.643122,13.582614 +10X_cells.ACGCCAGGTAGAAAGG-L8TX_180907_01_G11,-2.29335,8.822994 +10X_cells.TGCTACCTCTGACCTC-L8TX_180907_01_H11,-4.3659186,13.81424 +Smartseq_cells.SM-DD443_S21_E1-50,-5.3944144,12.938183 +Smartseq_cells.SM-GE5US_S022_E1-50,-5.9910593,12.230148 +Smartseq_cells.SM-GE5US_S338_E1-50,-4.24457,13.859833 +Smartseq_cells.SM-GE5UT_S113_E1-50,-2.8652885,13.76864 +Smartseq_cells.SM-GE5UT_S152_E1-50,-5.9198394,12.370383 +Smartseq_cells.SM-GE5UT_S301_E1-50,-5.599496,13.534182 +10X_cells.GGAACTTAGCCGTCGT-L8TX_180926_01_B01,-1.5405784,8.602515 +10X_cells.TCAACGATCATGTAGC-L8TX_180926_01_B01,-1.5854703,8.336656 +10X_cells.TGTGGTATCGTTTGCC-L8TX_180926_01_B01,-4.9413304,11.126175 +10X_cells.ACGATACCATAGAAAC-L8TX_180926_01_D01,-3.2058625,9.547881 +10X_cells.ACGCCGATCCCGGATG-L8TX_180926_01_D01,-1.2026399,8.392326 +10X_cells.CTCATTAAGTGTGAAT-L8TX_180926_01_D01,-2.1086977,8.412006 +10X_cells.TAAGCGTGTTCCGTCT-L8TX_180926_01_D01,-1.5454491,8.43457 +10X_cells.TCTTCGGGTCTAGAGG-L8TX_180926_01_D01,-3.3343801,8.867679 +10X_cells.TGGCCAGAGTCCCACG-L8TX_180926_01_D01,-4.122278,11.405727 +10X_cells.CTTCTCTCAGCTTAAC-L8TX_180926_01_E01,-1.7928296,9.461807 +10X_cells.GCATACAAGATGTTAG-L8TX_180926_01_E01,-2.4020624,8.232203 +10X_cells.GGTGTTAGTTGGTTTG-L8TX_180926_01_E01,-3.0503104,10.433452 +10X_cells.TCAGGTAGTCGCTTCT-L8TX_180926_01_E01,-0.8852756,11.058568 +10X_cells.TCATTACGTTACGACT-L8TX_180926_01_E01,-2.082094,9.440486 +10X_cells.AACTTTCAGGCGACAT-L8TX_180926_01_F01,-2.870236,9.315134 +10X_cells.ATTACTCCAATCGAAA-L8TX_180926_01_F01,-4.1995783,10.416695 +10X_cells.CACACCTTCTAACTGG-L8TX_180926_01_F01,-0.005120157,8.301048 +10X_cells.CACAGGCCATGGTAGG-L8TX_180926_01_F01,-2.1124454,9.726432 +10X_cells.CAGCAGCAGATCCGAG-L8TX_180926_01_F01,-2.1775331,8.796715 +10X_cells.CGGGTCACAATCTGCA-L8TX_180926_01_F01,-1.4794589,8.833593 +10X_cells.GCATGATCAATCCAAC-L8TX_180926_01_F01,0.13099027,8.341676 +10X_cells.GGGCACTAGCTGAAAT-L8TX_180926_01_F01,-3.8347616,9.393343 +10X_cells.CTGCCTAAGAGTTGGC-L8TX_181011_01_A03,-1.2456843,9.947168 +10X_cells.TTTCCTCCAGGTCCAC-L8TX_181011_01_A03,-2.4028902,8.846011 +10X_cells.CAAGTTGTCGGCGCTA-L8TX_181011_01_B03,-1.9708394,9.524726 +10X_cells.CTACATTCACAGCCCA-L8TX_181011_01_B03,-0.7251,10.28749 +10X_cells.TAAGCGTTCTACTTAC-L8TX_181011_01_B03,-2.37664,9.389415 +10X_cells.TCACGAAAGACATAAC-L8TX_181011_01_B03,-3.5265694,12.513716 +10X_cells.TCCACACTCGCCTGAG-L8TX_181011_01_B03,-1.3293341,9.293727 +10X_cells.ACCTTTAAGCGTGAAC-L8TX_181011_01_C03,-1.894237,8.280906 +10X_cells.AGAGTGGTCGTTGACA-L8TX_181011_01_C03,-1.8674134,8.376608 +10X_cells.CGTCAGGAGCTGCCCA-L8TX_181011_01_C03,-0.15911849,9.405427 +10X_cells.GACTAACCACACAGAG-L8TX_181011_01_C03,-4.0951676,10.729832 +10X_cells.GGATTACCAATAAGCA-L8TX_181011_01_C03,-2.3453746,11.116754 +10X_cells.GTCATTTAGGCCCTTG-L8TX_181011_01_C03,-2.9091883,8.935387 +10X_cells.TCTTTCCAGGGTGTGT-L8TX_181011_01_C03,-3.3308551,11.336617 +10X_cells.AAGGAGCCATCCAACA-L8TX_181011_01_H03,-2.0517666,8.762986 +10X_cells.AGCTTGAGTGTTTGGT-L8TX_181011_01_H03,-3.0234632,9.421575 +10X_cells.ATTTCTGTCTGGAGCC-L8TX_181011_01_H03,-3.2662687,9.939397 +10X_cells.TACTCATCACCAACCG-L8TX_181011_01_H03,-0.0881131,7.855908 +10X_cells.CTAGAGTGTTCCAACA-L8TX_180221_01_A12,-0.52025914,7.4079 +10X_cells.CACATAGTCGTTTAGG-L8TX_200611_02_A05,-1.5759668,8.987034 +10X_cells.ACTTACTGTACTTCTT-L8TX_180712_01_E05,0.76757395,8.208399 +10X_cells.TTGCCGTTCACGATGT-L8TX_180221_01_B12,-0.356067,7.6463475 +10X_cells.ATAAGAGTCGATAGAA-L8TX_180504_01_E01,-0.2325574,8.185544 +10X_cells.TGGTTCCGTCTCCACT-L8TX_180712_01_E05,0.6993256,7.895709 +10X_cells.AGTGTCAAGAACTGTA-L8TX_180221_01_H11,-0.8112666,6.890343 +10X_cells.GACGCGTAGCGTGAAC-L8TX_180712_01_A06,-3.2976549,10.0504675 +10X_cells.AAACCTGTCGCCGTGA-L8TX_180221_01_A12,-0.79197735,6.81943 +10X_cells.ACGCAGCGTTCGCGAC-L8TX_180712_01_F05,-3.1818986,9.192442 +10X_cells.TGGTTCCGTAAGCACG-L8TX_180712_01_E05,-0.6446083,8.012759 +10X_cells.CATCAAGGTGTTTGTG-L8TX_180712_01_A06,-1.2035636,8.937438 +10X_cells.CGAGAAGTCTAACTGG-L8TX_180712_01_H05,-2.134259,8.8690605 +10X_cells.ACTGCTCTCTTCAACT-L8TX_180712_01_F05,1.0921901,7.9749026 +10X_cells.CATGCCTAGGGTGTTG-L8TX_180504_01_E01,-0.46725774,8.365511 +10X_cells.CCACGGAAGGCGACAT-L8TX_180221_01_B12,-3.9010286,8.57072 +10X_cells.GACTAACTCCCTCAGT-L8TX_180712_01_A06,-2.4674506,9.01465 +10X_cells.ATTGGTGAGGAGTTGC-L8TX_180712_01_H05,-5.0160713,10.607851 +10X_cells.TTTATGCTCATGCTCC-L8TX_180221_01_H11,-1.2574154,7.04492 +10X_cells.AGCTCCTGTGGTCCGT-L8TX_180221_01_C12,-1.833062,7.4240007 +10X_cells.CTGTGCTGTAATTGGA-L8TX_180712_01_F05,-2.948044,9.196797 +10X_cells.AAAGTAGTCATTATCC-L8TX_180221_01_A12,-0.37236443,7.319677 +10X_cells.AGGCCACTCTGCGGCA-L8TX_180221_01_B12,-1.5976536,7.8329763 +10X_cells.TCAGATGCACGAGAGT-L8TX_180221_01_C12,0.33702043,8.1183195 +10X_cells.AGTCTTTAGAAGATTC-L8TX_180712_01_F05,-3.7342694,10.545548 +10X_cells.CAGAATCTCCAATGGT-L8TX_180221_01_C12,-1.3304793,8.693154 +10X_cells.TGGTTCCTCATAGCAC-L8TX_180221_01_B12,-3.1046731,8.644389 +10X_cells.AACGTTGTCACGCATA-L8TX_180712_01_H05,-0.88701016,8.007441 +10X_cells.CGATGGCTCGCGCCAA-L8TX_180712_01_H05,-2.9393604,9.523368 +10X_cells.CATTATCGTAGAAAGG-L8TX_200611_02_A05,-1.6882477,8.269598 +10X_cells.CTCGTCAAGCTAGTGG-L8TX_180221_01_H11,-0.99148107,6.6413817 +10X_cells.AGCATACTCGTGGACC-L8TX_180221_01_H11,-0.51950926,6.9062176 +10X_cells.CTAACTTTCAACGCTA-L8TX_180712_01_A06,-1.7367058,10.332594 +10X_cells.GGGAGATAGTGTTAGA-L8TX_180504_01_E01,0.6358323,7.632686 +10X_cells.GCTTGAAGTAAGGGCT-L8TX_200611_02_A05,-2.5700219,9.147797 +10X_cells.TGAGAGGCACGAAGCA-L8TX_180712_01_E05,-1.6344253,7.9970083 +10X_cells.ACACTGAAGCGAAGGG-L8TX_180221_01_B12,-1.8021605,7.457674 +10X_cells.GCCAAATAGATCACGG-L8TX_180712_01_E05,-2.311646,8.560266 +10X_cells.TGAAAGAGTAGCGCTC-L8TX_180504_01_E01,-1.6014895,8.584786 +10X_cells.CTACATTAGCTTTGGT-L8TX_200611_02_A05,-2.3029702,9.577575 +10X_cells.GGGACCTGTTTGGCGC-L8TX_180712_01_H05,-2.987742,10.895978 +10X_cells.TGGCTGGTCGGTGTCG-L8TX_180712_01_A06,-2.1955595,9.5743885 +10X_cells.CACCACTCATCTATGG-L8TX_180712_01_A06,-3.5663903,11.404722 +10X_cells.ACATCAGAGAGCAATT-L8TX_180221_01_C12,0.33526593,7.5680494 +10X_cells.TGGTTAGCAGTGGAGT-L8TX_180221_01_H11,-0.9308274,7.070171 +10X_cells.CGAGAAGAGATGTGGC-L8TX_180712_01_E05,-2.4469929,9.561441 +10X_cells.CATGACATCCCATTAT-L8TX_200611_02_A05,-2.242678,9.851741 +10X_cells.AAGACCTGTTGAGTTC-L8TX_180221_01_A12,-2.7225876,11.319409 +10X_cells.GTTCGGGGTTGATTGC-L8TX_180504_01_E01,-1.7914232,8.989666 +10X_cells.AAACGGGTCAGTGTTG-L8TX_180221_01_A12,-1.354369,7.0766478 +10X_cells.ATCATCTTCGTTTAGG-L8TX_180712_01_E05,0.22730373,7.772038 +10X_cells.CCACTACGTCCCTTGT-L8TX_180712_01_H05,-2.899402,9.764628 +10X_cells.GGTATTGCACAGATTC-L8TX_180712_01_A06,0.2268061,11.122926 +10X_cells.GTATCTTGTTTGTTGG-L8TX_180504_01_E01,0.3683367,8.990543 +10X_cells.GATCGCGCAGTTCATG-L8TX_180221_01_A12,-1.330061,7.10621 +10X_cells.GCGCAGTTCCCTAACC-L8TX_180221_01_C12,-0.9972876,7.669068 +10X_cells.ACGCCGAAGGCTAGAC-L8TX_200611_02_A05,-2.799604,10.141605 +10X_cells.TCAGCAAAGAAACCGC-L8TX_200611_02_A05,-0.76465946,8.950245 +10X_cells.AGCTTGACATGCCTTC-L8TX_200611_02_A05,-3.2288837,10.690455 +10X_cells.CTCGAGGGTCTAAACC-L8TX_200611_02_A05,-2.1198444,9.682975 +10X_cells.AGTGGGATCTCTGAGA-L8TX_200611_02_A05,-0.9319166,8.574371 +Smartseq_cells.SM-GE679_S365_E1-50,-4.9501905,13.061193 +10X_cells.GCTGCGATCCCAAGTA-L8TX_180115_01_F11,-3.1146107,9.089323 +10X_cells.GGGAATGTCGAGAACG-L8TX_180115_01_D09,-3.325031,8.586979 +10X_cells.CTTAACTCAGATGGCA-L8TX_180115_01_D11,-0.69317204,11.761424 +10X_cells.TGCTGCTCACATTTCT-L8TX_180115_01_B10,-3.780327,8.8125925 +10X_cells.TTAACTCAGGCTAGCA-L8TX_180115_01_F09,-2.7035747,10.355742 +10X_cells.ACGCCGAGTCTAGGTT-L8TX_180115_01_E10,-3.8311534,8.631697 +10X_cells.GTCGGGTAGTATCGAA-L8TX_180115_01_C11,-3.4273608,8.679931 +10X_cells.GCGCGATAGTTCGATC-L8TX_180115_01_E11,-4.626018,11.789117 +10X_cells.TCGTAGACAGTTAACC-L8TX_180115_01_H10,-1.5957347,7.6570697 +10X_cells.ACAGCTAGTCCGAACC-L8TX_180115_01_D11,-3.2915123,11.137957 +10X_cells.TCACGAAAGGAGTTTA-L8TX_180115_01_G11,-2.8686476,11.952404 +10X_cells.TTTCCTCAGGCCCTCA-L8TX_180115_01_E11,-2.0737424,12.2293825 +10X_cells.TACGGGCTCACGACTA-L8TX_180115_01_D09,-4.1660156,8.587007 +10X_cells.GCATGATGTTCGCGAC-L8TX_180115_01_F09,-3.5151634,9.892294 +10X_cells.ATCGAGTTCTCTTATG-L8TX_180115_01_G10,-2.8356223,8.271404 +10X_cells.ATGAGGGCAATCTGCA-L8TX_180115_01_F09,-1.9291914,9.010294 +10X_cells.GTAGGCCAGCCGGTAA-L8TX_180115_01_G10,-1.5891924,7.4662576 +10X_cells.TTGAACGAGACACGAC-L8TX_180115_01_G11,-3.4666777,10.284477 +10X_cells.CTTACCGTCACGCGGT-L8TX_180115_01_A10,-2.73146,7.7094607 +10X_cells.AGTTGGTGTTGATTCG-L8TX_180115_01_F11,-3.2086616,10.4199705 +10X_cells.TAAGAGACAAGCCTAT-L8TX_180115_01_E09,-4.2347584,10.503006 +10X_cells.CATATTCAGCGTCTAT-L8TX_180115_01_E09,-3.7907114,9.671547 +10X_cells.TATCTCAGTTCCTCCA-L8TX_180115_01_H09,-4.1892977,10.264898 +10X_cells.GCGACCAGTCGTGGCT-L8TX_180115_01_C09,-1.4991106,9.919337 +10X_cells.GAGCAGAAGGCATTGG-L8TX_180115_01_E10,-5.8244553,11.060951 +10X_cells.ACGGCCAAGCCAGTTT-L8TX_180115_01_A10,-0.84669554,9.733264 +10X_cells.CGGACACTCCTAGGGC-L8TX_180115_01_H11,-2.3947086,11.121759 +10X_cells.CTCGAGGTCACGCGGT-L8TX_180115_01_D09,-5.2660546,10.300348 +10X_cells.CATATGGCATTCCTCG-L8TX_180115_01_H10,-1.8002009,10.497154 +10X_cells.AGTCTTTCACTTACGA-L8TX_180115_01_F11,-2.5351894,11.042473 +10X_cells.CTCGGAGGTCGCGTGT-L8TX_180115_01_G11,-2.7736237,9.753154 +10X_cells.CTAGAGTTCAGGCGAA-L8TX_180115_01_E11,-2.439713,9.898472 +10X_cells.GACGTGCTCCTCAATT-L8TX_180115_01_A10,-4.4159303,9.0769005 +10X_cells.CGAGAAGTCGTCACGG-L8TX_180115_01_D11,-2.222119,10.01153 +10X_cells.CACTCCAGTTATTCTC-L8TX_180115_01_G09,-2.4872296,7.510932 +10X_cells.GGACGTCTCCCAAGTA-L8TX_180115_01_G11,-0.2024136,9.503112 +10X_cells.GTGCTTCTCGAACTGT-L8TX_180115_01_C09,-2.5114424,9.91797 +10X_cells.GATGAGGCACCCAGTG-L8TX_180115_01_H11,-2.8684049,8.929217 +10X_cells.CATTCGCGTAGCTGCC-L8TX_180115_01_A11,-4.0431457,9.7196045 +10X_cells.GCGCCAAGTTTGGCGC-L8TX_180115_01_G10,-2.0757093,7.4414287 +10X_cells.CCGTACTAGAGCCTAG-L8TX_180115_01_F10,-4.0511513,9.983766 +10X_cells.GAACCTACATCGTCGG-L8TX_180115_01_E11,-2.8386025,10.627097 +10X_cells.TGACGGCAGGAGTACC-L8TX_180115_01_D11,-4.33071,10.963462 +10X_cells.TAAGCGTCAGCTGCTG-L8TX_180115_01_G10,-2.9798737,7.538464 +10X_cells.AACGTTGTCTGGGCCA-L8TX_180115_01_B09,-3.6851163,9.512802 +10X_cells.CTAGCCTGTTCCGTCT-L8TX_180115_01_C11,0.73978627,8.569776 +10X_cells.GATCGATCAAGTTAAG-L8TX_180115_01_C09,-3.6302094,8.413448 +10X_cells.ATGGGAGGTCAATGTC-L8TX_180115_01_A09,-1.1980535,10.119938 +10X_cells.TCCCGATCAGGTCTCG-L8TX_180115_01_F10,0.2938854,8.63272 +10X_cells.CACATAGCAGTTCCCT-L8TX_180115_01_G10,-2.8422928,8.619826 +10X_cells.CTACGTCCATTCTTAC-L8TX_171120_01_G07,-3.659857,10.590594 +10X_cells.CTCTACGGTGGCCCTA-L8TX_171120_01_G07,-3.169043,10.422625 +10X_cells.GGGTTGCTCTGTGCAA-L8TX_171120_01_G07,-2.6964297,7.6609836 +10X_cells.TTTACTGGTGAGTATA-L8TX_171120_01_G07,-2.2032545,10.664287 +10X_cells.CGGTTAAAGGACTGGT-L8TX_171120_01_H07,-3.6876564,9.3729105 +10X_cells.GTCTTCGTCTAAGCCA-L8TX_171120_01_H07,-2.2603917,11.127286 +10X_cells.CCGGTAGGTGGCTCCA-L8TX_180115_01_G08,-2.8120165,10.612487 +10X_cells.CGACTTCTCCAAGCCG-L8TX_180115_01_G08,-4.7139564,11.152959 +10X_cells.CGGACACTCCCTAACC-L8TX_180115_01_G08,-4.0073442,11.206899 +10X_cells.GCGCAACGTTGATTCG-L8TX_180115_01_G08,-4.302836,11.349706 +10X_cells.GTTTCTACACTGCCAG-L8TX_180115_01_G08,-2.797608,10.506156 +10X_cells.TTGCGTCCAGCGTCCA-L8TX_180115_01_G08,-3.3224769,11.548792 +10X_cells.AGGCCACGTCAGAGGT-L8TX_171120_01_C07,-3.7535067,10.285129 +10X_cells.ACGGCCAGTACGCTGC-L8TX_171120_01_C07,-2.0144994,12.031621 +10X_cells.AGCGTCGGTTCAGGCC-L8TX_171120_01_D07,-3.40519,7.634211 +10X_cells.CGGTTAAAGTACTTGC-L8TX_171120_01_D07,-0.29956076,10.6508665 +10X_cells.CGTTCTGGTTCAGCGC-L8TX_171120_01_D07,-0.36104354,9.288546 +10X_cells.TCTATTGTCCTTTCTC-L8TX_171120_01_D07,-3.2212648,8.89768 +10X_cells.AGCTCTCCAAGCTGGA-L8TX_171120_01_E07,-2.4194984,10.838518 +10X_cells.GGCGACTTCACTATTC-L8TX_171120_01_E07,-3.0405233,10.211754 +10X_cells.TGGGCGTGTTACTGAC-L8TX_171120_01_E07,-3.4952028,11.022614 +10X_cells.AGGCCGTTCTCTTGAT-L8TX_171120_01_F07,-2.51223,11.267358 +10X_cells.CGGAGTCAGGTGCACA-L8TX_171120_01_F07,-4.6177254,10.120245 +10X_cells.TGAGAGGGTACGACCC-L8TX_171120_01_F07,-0.44176584,8.991293 +10X_cells.TTAGTTCTCATCGCTC-L8TX_171120_01_F07,-1.9740672,10.8785515 +10X_cells.CAGAGAGAGTTGTAGA-L8TX_180115_01_F08,-0.91888136,12.514112 +10X_cells.GTCACGGTCCCAAGTA-L8TX_180115_01_F08,-1.9748603,11.457053 +10X_cells.TAGGCATTCTAACTGG-L8TX_180115_01_F08,-4.823489,11.857539 +10X_cells.ATGCGATTCGCGGATC-L8TX_180115_01_C08,-1.6619234,9.619174 +10X_cells.CCTCAGTCATCGGGTC-L8TX_180115_01_E08,-2.9930284,10.969451 +10X_cells.TGTGGTATCATACGGT-L8TX_180115_01_E08,-2.131513,11.056418 +Smartseq_cells.LS-15033_S79_E1-50,-2.9706533,13.921881 +Smartseq_cells.LS-15061_S53_E1-50,-3.236756,14.839863 +Smartseq_cells.LS-15061_S68_E1-50,-3.346378,14.05183 +Smartseq_cells.LS-15061_S71_E1-50,-2.3452177,14.760078 +Smartseq_cells.LS-15062_S71_E1-50,-5.973021,12.838902 +Smartseq_cells.LS-15097_S06_E1-50,-2.7389407,14.535088 +Smartseq_cells.LS-15307_S88_E1-50,-4.3238,14.31787 +Smartseq_cells.LS-15338_S95_E1-50,-3.5658865,13.769584 +Smartseq_cells.LS-15352_S62_E1-50,-3.5948534,14.926721 +Smartseq_cells.LS-15352_S70_E1-50,-3.790292,14.000985 +Smartseq_cells.LS-15356_S94_E3-50,-4.035062,13.56056 +Smartseq_cells.LS-15510_S93_E1-50,-5.310611,12.87394 +Smartseq_cells.LS-15542_S83_E1-50,-2.3055208,13.932526 +Smartseq_cells.LS-15544_S39_E1-50,-6.2976294,11.176083 +Smartseq_cells.LS-15545_S59_E1-50,-4.819841,13.8752165 +Smartseq_cells.LS-15545_S81_E1-50,-4.4129305,13.4991455 +Smartseq_cells.SM-D9E4J_S28_E1-50,-3.417166,13.023603 +Smartseq_cells.SM-GE63I_S096_E1-50,-2.6647375,14.122635 +Smartseq_cells.SM-GE67T_S015_E1-50,-4.904812,13.429417 +Smartseq_cells.SM-GE67T_S205_E1-50,-4.1152635,14.428002 +Smartseq_cells.SM-GE8X6_S006_E1-50,-4.120205,14.700419 +10X_cells.ATCACGATCATGTCTT-L8TX_180221_01_G09,-3.2076898,14.157211 +10X_cells.CCATTCGCACACTGCG-L8TX_180221_01_G09,-0.9227576,11.251712 +10X_cells.GACGTGCTCATGCATG-L8TX_180221_01_G09,-2.3225856,14.168123 +10X_cells.GAGGTGACAGACGCTC-L8TX_180406_01_F02,-2.1966846,14.519224 +10X_cells.TCAGGATTCTGTACGA-L8TX_180406_01_F02,-1.7306191,10.340255 +10X_cells.ACCGTAAGTGTGTGCC-L8TX_180406_01_C06,-1.8237288,14.03003 +10X_cells.GTCATTTAGTACGTAA-L8TX_180406_01_C06,0.7085767,15.015377 +10X_cells.CTCGGGAAGCGGATCA-L8TX_180712_01_G05,-1.4393972,15.443613 +10X_cells.TGCACCTTCTCGAGTA-L8TX_180221_01_H12,-3.3030503,10.922533 +10X_cells.CGTCCATCACAAGTAA-L8TX_180221_01_E09,-2.5559602,14.882674 +Smartseq_cells.LS-15087_S87_E1-50,-2.8087738,14.992624 +Smartseq_cells.LS-15338_S39_E1-50,-0.6177553,15.921197 +10X_cells.CTCATTACACGGCCAT-L8TX_180829_01_D09,-2.803043,10.814875 +10X_cells.GACTAACTCGGCGGTT-L8TX_180829_01_E10,-0.2584925,12.901696 +10X_cells.TCGAGGCGTCGTTGTA-L8TX_180829_01_E10,-0.106605604,13.84032 +10X_cells.GTCGGGTGTCTAACGT-L8TX_181011_01_G02,-3.3819065,10.745288 +10X_cells.TAGTGGTGTTTCCACC-L8TX_181011_01_G02,-1.2416523,10.017038 +10X_cells.AACTCCCGTGCCTGCA-L8TX_181012_01_H04,-2.5757627,10.96108 +10X_cells.GTCGTAAGTCGGCACT-L8TX_180406_01_G02,-0.26322594,14.176929 +10X_cells.CGCTATCAGTCACGCC-L8TX_180406_01_H01,-1.6661549,10.717926 +10X_cells.GCTCTGTCAGGTTTCA-L8TX_180406_01_E02,-2.989206,11.167943 +10X_cells.AGAGCTTTCTTGTATC-L8TX_180406_01_G02,2.5480764,11.530323 +10X_cells.GACCAATGTCTGCCAG-L8TX_180406_01_B06,-0.45759684,9.636144 +10X_cells.CGGCTAGTCGCCTGAG-L8TX_180406_01_E06,-1.5477766,10.451815 +10X_cells.TTGACTTTCCTGTAGA-L8TX_180406_01_C08,0.080104336,7.7816057 +Smartseq_cells.SM-GE5V6_S059_E1-50,-2.9310377,14.831177 +10X_cells.CTACGTCAGGCCCTCA-L8TX_171026_01_E05,-4.5695314,11.946621 +10X_cells.GATTCAGCATCGGACC-L8TX_171026_01_G03,-2.2835162,13.44028 +10X_cells.CTGTGCTCAGCCTATA-L8TX_171026_01_F03,-0.8021319,11.992573 +10X_cells.GGCTCGATCGCTTGTC-L8TX_171026_01_F03,-0.8030897,16.046593 +10X_cells.GTCTCGTTCCTCCTAG-L8TX_171026_01_F03,-0.95893383,12.475917 +10X_cells.AGATTGCAGTTACCCA-L8TX_171026_01_G03,0.004009777,14.566895 +10X_cells.CACAGTACACGTAAGG-L8TX_171026_01_G03,-2.8383965,13.634673 +10X_cells.GACGTTAAGCGACGTA-L8TX_171026_01_G03,-2.7481813,14.09814 +10X_cells.GCTGCTTGTAGGAGTC-L8TX_171026_01_G03,-0.32525915,15.774863 +10X_cells.TTATGCTAGCTGTTCA-L8TX_171026_01_G03,-0.004918726,15.409674 +10X_cells.GTGTTAGGTATATGAG-L8TX_171026_01_B04,-2.7729223,14.609011 +10X_cells.TACCTTAAGGATATAC-L8TX_171026_01_B04,0.16071166,15.741966 +10X_cells.GCCAAATCAGCTCGCA-L8TX_171026_01_F04,-0.38321564,15.942539 +10X_cells.GTCTCGTAGCTACCGC-L8TX_171026_01_F04,-2.549874,14.305642 +10X_cells.GACACGCGTTCGAATC-L8TX_171026_01_G04,-0.8423154,16.210623 +10X_cells.TCTGGAACATCGGGTC-L8TX_171026_01_G04,-5.7176695,13.496409 +10X_cells.GCCAAATTCCACGACG-L8TX_171026_01_H04,-4.8303084,13.800211 +10X_cells.GGGAGATGTTCCACTC-L8TX_171026_01_H04,-1.7476785,14.81159 +10X_cells.CCTACCAAGCGCCTTG-L8TX_171026_01_A05,-0.37590984,16.0473 +10X_cells.CTAGTGAGTCTACCTC-L8TX_171026_01_A05,-0.43554413,15.4023 +10X_cells.GATCGATTCTCGCATC-L8TX_171026_01_A05,-2.4626062,14.10582 +10X_cells.TGCGGGTCAACACCTA-L8TX_171026_01_H03,-2.8619947,14.05209 +10X_cells.ATTATCCAGATATACG-L8TX_171026_01_A04,0.21183977,15.770012 +10X_cells.CTGCCTATCGTAGGTT-L8TX_171026_01_C05,-0.74334586,9.791334 +10X_cells.GCATGATTCTCTGAGA-L8TX_171026_01_C05,-1.1858674,15.879974 +10X_cells.GTATTCTAGCATGGCA-L8TX_171026_01_C05,-3.1640077,13.316539 +10X_cells.TAAGCGTTCAAACGGG-L8TX_171026_01_D05,-0.0199117,15.419529 +10X_cells.ACTATCTTCGTCACGG-L8TX_171026_01_E05,-6.772271,13.127374 +10X_cells.AGCATACCAACGATGG-L8TX_171026_01_E05,0.040388025,15.628477 +10X_cells.CTTACCGTCGTGGTCG-L8TX_171026_01_E05,-0.7647328,16.222837 +10X_cells.TAGTTGGCAAGAAAGG-L8TX_171026_01_E05,-5.31898,12.000679 +10X_cells.ACTGTCCCACATGGGA-L8TX_171026_01_F05,-1.6740173,15.770242 +10X_cells.GGCAATTAGTCCAGGA-L8TX_171026_01_G05,-2.687719,12.491892 +10X_cells.CGGGTCACAGGTGGAT-L8TX_171026_01_H05,-3.7100544,11.057745 +10X_cells.CGTGTAACAATCGGTT-L8TX_171026_01_H05,-2.8088255,11.762836 +10X_cells.GTCACAAAGAATGTGT-L8TX_180406_01_E01,-2.5679507,12.801798 +10X_cells.GCGAGAAAGTTGTCGT-L8TX_180406_01_F01,0.5259998,8.015857 +10X_cells.CCTATTACAAGGTGTG-L8TX_180406_01_G01,-0.67708796,9.0522 +10X_cells.CTCGTCACAAGGTGTG-L8TX_180406_01_G01,0.6914577,14.325759 +10X_cells.TTAGGACGTTTAGCTG-L8TX_180406_01_B02,0.010139459,8.638707 +10X_cells.ATTATCCTCACGCGGT-L8TX_190312_01_B02,-1.0407808,13.572242 +10X_cells.GTGGGTCCAGCGTTCG-L8TX_180221_01_E10,-2.6174045,14.986489 +10X_cells.ACGCAGCGTACTTAGC-L8TX_180221_01_D10,-1.8320041,13.461628 +10X_cells.CCGGGATTCGTAGGTT-L8TX_180221_01_E10,-1.1967264,9.641568 +10X_cells.GACTACACACTTAAGC-L8TX_180221_01_E10,1.4403839,14.619586 +10X_cells.GGCGTGTAGACTTTCG-L8TX_180221_01_F10,-3.8850384,10.404572 +10X_cells.CAGATCACATGAAGTA-L8TX_180221_01_G10,1.4504269,14.499466 +10X_cells.AACCATGGTTCAACCA-L8TX_180221_01_H10,0.52774465,13.065139 +10X_cells.ATTACTCCACCGAAAG-L8TX_180221_01_A11,-0.6679822,15.7543745 +10X_cells.GACAGAGGTCTGCCAG-L8TX_180221_01_A11,-1.0801634,9.257466 +10X_cells.CATTCGCCAAGAAGAG-L8TX_190312_01_B02,-1.1286788,10.307057 +10X_cells.GAATGAATCATGGTCA-L8TX_180926_01_C12,-1.0259601,16.05676 +10X_cells.ATTGGACTCCAACCAA-L8TX_181012_01_B05,-3.9141455,12.522811 +10X_cells.CAGAATCCATATGGTC-L8TX_181012_01_B05,-4.566204,12.084414 +10X_cells.TCTGAGACAAGTAATG-L8TX_181012_01_B05,-2.6675858,14.276368 +10X_cells.CTTGGCTAGCCACGCT-L8TX_181012_01_C05,-3.7719893,13.17586 +10X_cells.GGGTTGCGTAATAGCA-L8TX_181012_01_C05,-0.98547065,11.564079 +Smartseq_cells.SM-GE67Q_S170_E1-50,-3.7684908,14.907903 +10X_cells.AATCGGTTCATAACCG-L8TX_180907_01_H11,0.24083087,11.331436 +10X_cells.AGCTTGACAGTAGAGC-L8TX_180907_01_B12,-2.116261,10.957585 +10X_cells.TGAGCATAGCGTAGTG-L8TX_180907_01_B12,-0.86457264,13.40289 +10X_cells.CCTCAGTAGTCGAGTG-L8TX_181011_01_B03,-1.7156392,15.775224 +10X_cells.CGATCGGGTACAAGTA-L8TX_180926_01_B01,1.2890482,13.500926 +10X_cells.TCAGGTATCGACAGCC-L8TX_181011_01_A03,-3.4667938,12.046596 +10X_cells.CTAGCCTTCGAACGGA-L8TX_181011_01_B03,-3.2124403,11.869518 +10X_cells.CATCAAGCACGGTAGA-L8TX_181011_01_C03,-1.0670686,8.983322 +10X_cells.GTTCTCGTCCCTTGTG-L8TX_181011_01_H03,-4.0991125,13.490627 +10X_cells.ACATGGTGTCATGCAT-L8TX_180221_01_C12,1.1853634,13.915436 +10X_cells.TGCCAAAGTTCGTGAT-L8TX_180712_01_E05,-1.0983403,10.696546 +10X_cells.GTTACAGTCTCTTGAT-L8TX_180712_01_H05,-0.823363,13.030484 +10X_cells.CTAACTTGTGTGCCTG-L8TX_180221_01_A12,-0.39180738,8.499302 +10X_cells.GAAATGAGTTTACTCT-L8TX_180221_01_B12,0.62183535,10.191937 +10X_cells.TTGAACGAGTGGAGAA-L8TX_180221_01_B12,-3.9981024,11.218041 +10X_cells.ATAAGAGCATCCAACA-L8TX_180221_01_C12,-3.9554713,12.441131 +10X_cells.GACTACACACGAAATA-L8TX_180221_01_C12,-0.44553715,13.558756 +10X_cells.GTAGTCATCGTAGATC-L8TX_180221_01_C12,-0.9243976,13.1006365 +10X_cells.TCGGTAACACAGTCGC-L8TX_200611_02_A05,-1.6539736,13.880195 +10X_cells.GTCGGGTTCTTACCGC-L8TX_180115_01_F11,-2.9378095,12.371804 +10X_cells.ACACTGAAGATCGATA-L8TX_180115_01_G11,-5.1596193,12.548968 +10X_cells.CGAGCACGTCATATCG-L8TX_180115_01_A10,-2.850709,11.918881 +10X_cells.CACAGTAGTTTAGCTG-L8TX_180115_01_F10,-0.27645534,10.03499 +10X_cells.GTGCTTCGTCCAACTA-L8TX_180115_01_D11,-1.735119,14.821048 +10X_cells.TCATTACGTAGCGATG-L8TX_180115_01_F11,-1.6197912,11.885215 +10X_cells.ACTGTCCCAATAGCAA-L8TX_180115_01_H11,-1.9129977,14.37358 +10X_cells.ACGAGCCCATACGCCG-L8TX_180115_01_B11,0.12054738,14.342794 +10X_cells.ACCAGTAAGTCTTGCA-L8TX_180115_01_H10,-5.560396,11.967549 +10X_cells.CATGGCGCACTCAGGC-L8TX_180115_01_F11,-2.789204,13.368272 +10X_cells.CAGCCGATCAATCACG-L8TX_180115_01_E11,0.596715,14.08034 +10X_cells.GTCACGGGTCTCTTAT-L8TX_180115_01_G09,-0.5921117,10.03861 +10X_cells.TCTATTGTCTGGCGTG-L8TX_180115_01_F11,0.35341683,13.927671 +10X_cells.CTCGAGGAGAGCCCAA-L8TX_180115_01_G11,-2.6940854,13.965169 +10X_cells.AAACGGGAGGCTAGCA-L8TX_180115_01_E11,-4.6930666,12.15477 +10X_cells.CCTACCACAGCGTCCA-L8TX_180115_01_D11,-0.31342164,15.532614 +10X_cells.GCGCCAACAAGCGTAG-L8TX_180115_01_H11,0.7792212,10.8254595 +10X_cells.TCCCGATCAAAGTGCG-L8TX_180115_01_G10,-0.17755762,12.217602 +10X_cells.ACGAGCCGTCGTCTTC-L8TX_180115_01_H10,-3.2963736,14.35641 +10X_cells.GTACTCCAGCCACCTG-L8TX_180115_01_G10,-2.2113903,12.517579 +10X_cells.CTGCGGAGTAGCGATG-L8TX_180115_01_G11,-1.0373707,14.308155 +10X_cells.GTACTTTGTCACCTAA-L8TX_180115_01_E09,-2.041612,11.876825 +10X_cells.ATGTGTGCACCCATTC-L8TX_180115_01_E09,-3.1260347,10.868918 +10X_cells.AAGCCGCCATGCTGGC-L8TX_180115_01_C09,-5.8840957,11.412138 +10X_cells.GTACTCCCATTCCTCG-L8TX_180115_01_D11,-0.27827743,11.022841 +10X_cells.GTCTTCGAGAGGACGG-L8TX_180115_01_G10,-3.528108,8.082954 +10X_cells.TGATTTCCAAGTTAAG-L8TX_180115_01_H09,-3.5602458,11.131907 +10X_cells.CCTATTATCCATGAGT-L8TX_180115_01_A11,0.77554256,14.717967 +10X_cells.GTCTCGTGTACTCAAC-L8TX_180115_01_D11,-0.9980631,9.813485 +10X_cells.GTAACTGTCGATAGAA-L8TX_180115_01_A10,-3.408714,11.358 +10X_cells.AACCATGTCAAAGTAG-L8TX_180115_01_B11,-1.4644804,10.160234 +10X_cells.CGTAGCGAGACCCACC-L8TX_180115_01_G10,-0.9390898,10.687878 +10X_cells.TGTCCCAAGGCCCTTG-L8TX_180115_01_E10,-0.26738465,10.986134 +10X_cells.GATCGTAGTCTCCCTA-L8TX_180115_01_F11,-1.2979802,15.410415 +10X_cells.CGAGCACGTCACACGC-L8TX_180115_01_D11,-2.7339613,11.109319 +10X_cells.AATCCAGCACTACAGT-L8TX_180115_01_D09,-3.4463549,8.478291 +10X_cells.CTCGAGGAGACGCTTT-L8TX_180115_01_B11,-0.32476747,16.076311 +10X_cells.GATCGATAGTCCGGTC-L8TX_180115_01_G11,-2.5583155,14.086798 +10X_cells.GCGCAGTTCAGGCCCA-L8TX_180115_01_H11,-2.5961828,13.876856 +10X_cells.TCATTACAGAAGGTGA-L8TX_180115_01_F11,0.71414226,14.692032 +10X_cells.TCAGCAACATGTCGAT-L8TX_180115_01_G10,-3.1177478,10.973051 +10X_cells.GCTGCGATCCGCGGTA-L8TX_180115_01_E10,-2.4683952,11.535621 +10X_cells.ATTACTCTCCTCCTAG-L8TX_180115_01_F11,-3.270648,14.75507 +10X_cells.GGGAATGAGATATGCA-L8TX_180115_01_B09,-2.541515,14.495156 +10X_cells.TTTATGCGTGTTCGAT-L8TX_180115_01_F11,0.26469496,9.230456 +10X_cells.TGTTCCGGTCTAGCGC-L8TX_180115_01_H11,-2.5896,8.634669 +10X_cells.TGGTTCCGTCCCTTGT-L8TX_180115_01_B11,-3.60078,9.232138 +10X_cells.CATTCGCCATGCCTTC-L8TX_180115_01_H11,-4.3131704,13.383524 +10X_cells.GCGCAGTCACGGTTTA-L8TX_180115_01_D10,-3.1588168,11.843516 +10X_cells.TTGCCGTGTCCGTCAG-L8TX_180115_01_E11,-3.7051594,11.50079 +10X_cells.AGACGTTTCACCTTAT-L8TX_180115_01_E11,-2.3886456,12.99297 +10X_cells.AAATGCCGTTACTGAC-L8TX_180115_01_G11,-2.7263768,13.808238 +10X_cells.AAGACCTTCTCGCTTG-L8TX_180115_01_C09,-3.9031208,11.032093 +10X_cells.GAGCAGATCGAATCCA-L8TX_180115_01_D11,-2.847499,14.005617 +10X_cells.GCCTCTACACTATCTT-L8TX_180115_01_A11,-2.513078,13.254318 +10X_cells.CGTTAGACACTACAGT-L8TX_171120_01_G07,-1.843291,15.482884 +10X_cells.AGATCTGTCAGCAACT-L8TX_180115_01_G08,-5.212207,14.305231 +10X_cells.GATGAGGTCATCTGCC-L8TX_180115_01_G08,-1.8592292,15.88766 +10X_cells.GAAGCAGAGTTGCAGG-L8TX_171120_01_C07,-2.2968862,15.353612 +10X_cells.ATTATCCTCATTGCCC-L8TX_171120_01_D07,-3.5660737,13.385756 +10X_cells.CCATGTCTCGCGTTTC-L8TX_180115_01_C08,-0.24183387,10.200601 +10X_cells.CAGCATACAAGCGAGT-L8TX_180115_01_E08,-3.4312365,14.846387 +10X_cells.TAAGCGTTCGACCAGC-L8TX_180115_01_E08,-2.6898851,13.360834 +Smartseq_cells.LS-15061_S79_E1-50,-3.6929224,14.930997 +Smartseq_cells.LS-15338_S73_E1-50,-1.6837296,15.699428 +Smartseq_cells.LS-15338_S77_E1-50,-3.2025921,15.174449 +Smartseq_cells.LS-15366_S44_E1-50,-3.5990174,14.878417 +Smartseq_cells.LS-15546_S13_E1-50,-0.14432861,15.59734 +Smartseq_cells.SM-D9D8K_S91_E1-50,-2.2406971,14.871609 +Smartseq_cells.SM-GE67T_S012_E1-50,-0.51229364,15.073764 +Smartseq_cells.SM-GE67T_S028_E1-50,-2.732351,14.844667 +Smartseq_cells.SM-GE94L_S044_E1-50,-3.8944018,14.837559 +10X_cells.AACCGCGTCAGGCGAA-L8TX_180406_01_H01,-1.0695715,9.569655 +10X_cells.GACGGCTCAAAGGTGC-L8TX_180406_01_H01,-0.8336194,8.901893 +10X_cells.GCCTCTATCAGTTCGA-L8TX_180406_01_H01,-1.5158038,10.641117 +10X_cells.TGACGGCCATTTGCTT-L8TX_180406_01_H01,-0.5539946,8.85554 +10X_cells.TTTCCTCAGCCCAGCT-L8TX_180406_01_H01,-2.3981924,13.008124 +10X_cells.AGCGTCGTCCGTCAAA-L8TX_180406_01_E02,0.18091388,8.0841255 +10X_cells.CAGCTGGCATCTATGG-L8TX_180406_01_E02,-1.4021444,10.093097 +10X_cells.CCACGGATCTCTGTCG-L8TX_180406_01_E02,-1.6498398,10.38129 +10X_cells.CCTAGCTAGAGGTTGC-L8TX_180406_01_E02,0.8052342,8.165291 +10X_cells.GAAACTCGTACCAGTT-L8TX_180406_01_E02,0.37009665,8.386535 +10X_cells.GGAGCAATCAGTACGT-L8TX_180406_01_E02,-0.23135439,8.661803 +10X_cells.TATCTCAAGAACAACT-L8TX_180406_01_E02,-1.0066952,9.935341 +10X_cells.TCGAGGCTCTGCAAGT-L8TX_180406_01_E02,-2.1630092,11.522452 +10X_cells.CGACTTCCATGTAAGA-L8TX_180406_01_G02,-0.34196094,8.921083 +10X_cells.GTCGTAATCACGACTA-L8TX_180406_01_G02,0.1272777,8.679094 +10X_cells.TGGGAAGTCTTTACGT-L8TX_180406_01_G02,-1.1197348,9.694181 +10X_cells.TTAACTCCAGGTCGTC-L8TX_180406_01_G02,-0.816197,9.083718 +10X_cells.TTGCGTCCATCTCCCA-L8TX_180406_01_G02,-0.79041874,9.124506 +10X_cells.CCTATTAAGTGTTAGA-L8TX_180406_01_H02,-1.5255973,10.090156 +10X_cells.CTGAAACGTACGAAAT-L8TX_180406_01_H02,-2.38363,11.857516 +10X_cells.CTGCTGTAGCTAGGCA-L8TX_180406_01_H02,-0.29956746,10.264198 +10X_cells.ACACCCTAGGAATCGC-L8TX_180406_01_B06,0.49817422,7.8782277 +10X_cells.CCGTACTTCCCATTAT-L8TX_180406_01_E06,0.31277263,8.509485 +10X_cells.TCTTTCCAGATACACA-L8TX_180406_01_E06,-1.1492366,10.006907 +10X_cells.TGCTACCCAGACGCCT-L8TX_180406_01_C08,-1.7472194,10.798087 +10X_cells.CGGACTGAGCTACCTA-L8TX_180406_01_E07,1.0185455,7.307279 +10X_cells.GGAATAACACAGGTTT-L8TX_180406_01_E07,1.3248234,7.25004 +Smartseq_cells.SM-GE91J_S049_E1-50,-3.2690551,14.437894 +10X_cells.CGCTATCTCTACTTAC-L8TX_180406_01_F01,-1.1372111,9.613137 +10X_cells.ACGCAGCGTCAGTGGA-L8TX_180406_01_B01,-0.6056476,8.831634 +10X_cells.ACGGGCTAGGCACATG-L8TX_180406_01_B01,-0.5047454,8.540725 +10X_cells.TACAGTGGTTTGGGCC-L8TX_180406_01_B01,0.6132562,8.049877 +10X_cells.TATCTCAGTCGCATAT-L8TX_180406_01_B01,-1.0529343,9.637977 +10X_cells.ATGAGGGAGACTAAGT-L8TX_180406_01_C01,-0.10502319,8.773008 +10X_cells.CTCGAAATCGCATGGC-L8TX_180406_01_C01,-1.9040389,14.222284 +10X_cells.CTCGTACAGATACACA-L8TX_180406_01_C01,-0.9249727,9.997641 +10X_cells.TCATTTGCAAAGCAAT-L8TX_180406_01_C01,-1.3005835,9.810373 +10X_cells.GCTGCGACACACATGT-L8TX_180406_01_E01,-0.30336845,8.607505 +10X_cells.AGCGGTCCACCATGTA-L8TX_180406_01_F01,-1.7510085,10.976393 +10X_cells.CCACCTAAGTCCGGTC-L8TX_180406_01_F01,-2.4836006,11.53239 +10X_cells.GGCTCGACATATACGC-L8TX_180406_01_G01,-0.7561802,9.15883 +10X_cells.TCCCGATCACCAGTTA-L8TX_180406_01_B02,-2.976545,7.627903 +10X_cells.TGAGAGGGTCGTTGTA-L8TX_180406_01_B02,0.017844267,8.541597 +10X_cells.ACGGGTCCAGGAATGC-L8TX_180406_01_C02,-1.347198,10.4183235 +10X_cells.AGCTCCTTCTCCGGTT-L8TX_180406_01_C02,-2.107605,11.452904 +10X_cells.GACAGAGTCAGCACAT-L8TX_180406_01_C02,1.1419778,7.8941526 +10X_cells.CCGGGATCAGGATCGA-L8TX_180406_01_D02,0.556145,7.9605064 +10X_cells.GCGACCATCGGCTTGG-L8TX_180406_01_D02,-0.42420784,9.063615 +10X_cells.GTTCATTAGTGAAGTT-L8TX_180406_01_D02,-1.4607176,10.225253 +10X_cells.TACACGACAATGGTCT-L8TX_180406_01_D02,0.53694063,8.163304 +Smartseq_cells.SM-GE91B_S151_E1-50,-1.5978056,14.637426 +10X_cells.TCTGGAATCTCCAGGG-L8TX_180221_01_G09,-1.4755939,13.295315 +10X_cells.CGTTCTGGTCCAGTAT-L8TX_180221_01_H09,0.69186544,8.9384 +10X_cells.TGGCGCAAGGGCATGT-L8TX_180221_01_B10,-1.5749296,13.01343 +10X_cells.CCAATCCAGTTCCACA-L8TX_180406_01_F02,0.5814805,10.839161 +10X_cells.CAGAATCCAGGTTTCA-L8TX_180221_01_E09,1.8053267,8.626668 +10X_cells.ACGGAGATCCGAATGT-L8TX_180221_01_C09,-1.500082,7.3739963 +10X_cells.CGTAGGCAGAATGTTG-L8TX_180221_01_C09,-0.73358566,9.945047 +10X_cells.GCTTGAAAGTGACTCT-L8TX_180221_01_C09,-0.3304662,10.267303 +10X_cells.TCTCATACATTCTCAT-L8TX_180221_01_C09,-0.70760816,12.459043 +10X_cells.AGGGAGTAGGCAAAGA-L8TX_180221_01_D09,0.70335305,7.2054267 +10X_cells.TGATTTCGTTGGGACA-L8TX_180221_01_D09,0.052718293,9.293291 +10X_cells.GAGGTGAGTATGAATG-L8TX_180712_01_C06,0.2647298,11.737845 +Smartseq_cells.SM-GE67M_S046_E1-50,-0.14733714,11.926752 +Smartseq_cells.LS-15087_S37_E1-50,-1.9962058,14.463521 +Smartseq_cells.LS-15305_S82_E1-50,-1.4991276,14.025949 +Smartseq_cells.LS-15315_S90_E1-50,-0.70537037,12.964034 +Smartseq_cells.LS-15333_S02_E1-50,-1.7531701,14.224312 +Smartseq_cells.LS-15339_S28_E1-50,-1.8208255,14.100959 +Smartseq_cells.LS-15345_S68_E1-50,-1.9206223,13.648989 +Smartseq_cells.SM-D9EPG_S48_E1-50,-0.68451256,13.547863 +Smartseq_cells.SM-D9EPG_S93_E1-50,-1.9228112,13.927963 +Smartseq_cells.SM-D9EPH_S46_E1-50,-1.37547,14.461442 +Smartseq_cells.SM-D9EPH_S63_E1-50,-1.729049,14.313211 +Smartseq_cells.SM-D9EPH_S72_E1-50,-1.846759,14.211843 +Smartseq_cells.SM-D9D13_S83_E1-50,-0.2599256,12.955869 +Smartseq_cells.SM-D9D7N_S43_E1-50,-1.9323634,14.262292 +10X_cells.CTCCTAGGTGTGCCTG-L8TX_180829_01_D09,-0.36207905,12.108096 +10X_cells.CCTAGCTCAGATCTGT-L8TX_180829_01_E10,-0.10135574,11.925003 +10X_cells.GGATGTTAGGCCCTCA-L8TX_181012_01_G04,0.6074909,8.583559 +10X_cells.AGTAGTCGTTCCACTC-L8TX_181012_01_E05,0.6457741,10.866813 +10X_cells.CAAGATCAGCCGGTAA-L8TX_180406_01_H01,1.3258017,9.21986 +10X_cells.CTCGGAGAGTACGTTC-L8TX_180406_01_H01,-0.8719756,9.235204 +10X_cells.GTCTCGTAGATGGCGT-L8TX_180406_01_H01,0.5762124,9.996929 +10X_cells.GTGGGTCAGCGCCTTG-L8TX_180406_01_H01,1.9952437,8.996505 +10X_cells.TAGAGCTCACAGCGTC-L8TX_180406_01_H01,-0.43827686,9.117361 +10X_cells.TTGAACGCACACCGCA-L8TX_180406_01_H01,-0.32551035,9.04642 +10X_cells.ACACCCTCAGGACCCT-L8TX_180406_01_E02,0.04244917,11.844753 +10X_cells.TTTACTGGTCCGAACC-L8TX_180406_01_E02,1.0703434,9.8281975 +10X_cells.ACTGATGCATATACCG-L8TX_180406_01_G02,-0.40203568,8.125142 +10X_cells.AGAGTGGAGGGAACGG-L8TX_180406_01_G02,0.41887227,9.50407 +10X_cells.CACACTCGTACAGTTC-L8TX_180406_01_G02,1.9373779,8.5919 +10X_cells.GACGCGTCAAGCCGTC-L8TX_180406_01_G02,1.6311076,7.8256154 +10X_cells.GTTTCTAAGAAGCCCA-L8TX_180406_01_G02,0.80362916,10.137971 +10X_cells.AAAGTAGCAATCCAAC-L8TX_180406_01_H02,1.5862001,9.024549 +10X_cells.GCTGCTTTCGGAAATA-L8TX_180406_01_H02,1.3756955,8.357907 +10X_cells.GTACTCCCAGACGCCT-L8TX_180406_01_H02,0.7241639,10.706037 +10X_cells.ACTGATGTCTTGAGAC-L8TX_180406_01_B06,1.3322107,7.653179 +10X_cells.CAGATCATCGTTACGA-L8TX_180406_01_B06,0.06887732,10.476356 +10X_cells.GCGCCAAAGGGATCTG-L8TX_180406_01_E06,1.0612817,8.4382925 +10X_cells.GGAGCAAGTTCCAACA-L8TX_180406_01_E06,1.4196556,9.2775135 +10X_cells.ACACCAATCATGCTCC-L8TX_180406_01_C08,0.7059703,9.375493 +10X_cells.ATCTACTGTCGGCACT-L8TX_180406_01_C08,-1.2078493,8.474442 +10X_cells.CTCGAAAGTACCAGTT-L8TX_180406_01_C08,1.3233634,7.9260263 +10X_cells.GAGGTGAAGCGACGTA-L8TX_180406_01_C08,0.7396051,7.4866257 +10X_cells.GAGTCCGAGGATTCGG-L8TX_180406_01_C08,1.3747522,8.819238 +10X_cells.GATGAAACAGCTGTAT-L8TX_180406_01_C08,0.8205024,8.724503 +10X_cells.TGCGTGGCATGAACCT-L8TX_180406_01_C08,-0.975305,8.63804 +10X_cells.GCTCTGTCATACAGCT-L8TX_180406_01_E07,-0.3324977,9.200486 +Smartseq_cells.SM-GE91L_S275_E1-50,0.007488108,12.116302 +Smartseq_cells.SM-GE91C_S078_E1-50,0.3282744,12.613265 +10X_cells.GTCTCGTCAAAGTCAA-L8TX_200625_02_E11,0.15205732,12.139486 +10X_cells.TCGAGGCTCTCCAACC-L8TX_200625_02_G11,-0.49867663,11.760286 +10X_cells.CCTATTATCAGGTAAA-L8TX_171026_01_G03,-0.25218529,12.388084 +10X_cells.CGTTAGAAGCTGTCTA-L8TX_171026_01_B04,-0.20115316,11.148308 +10X_cells.TCTATTGAGCGGATCA-L8TX_171026_01_F04,-0.1038043,11.874463 +10X_cells.TTTGTCATCTGAGTGT-L8TX_171026_01_A05,-0.8177428,12.245167 +10X_cells.CATTCGCGTTTAGGAA-L8TX_171026_01_H03,-1.2520082,12.900849 +10X_cells.ACGGGTCAGATGTTAG-L8TX_171026_01_C05,-0.79906386,11.133388 +10X_cells.AACCATGCAGTCCTTC-L8TX_171026_01_D05,0.30715734,10.146838 +10X_cells.GTTACAGAGCGTGAGT-L8TX_171026_01_E05,-2.7375684,13.094903 +10X_cells.GCATGTAGTCACACGC-L8TX_171026_01_G05,-0.6867434,11.33591 +Smartseq_cells.SM-GE92L_S338_E1-50,-1.3299013,14.885988 +10X_cells.TCAGCAAAGATATGCA-L8TX_180406_01_D01,1.3461123,7.602371 +10X_cells.CGCTATCTCAACGAAA-L8TX_180406_01_B01,-0.03019058,10.518496 +10X_cells.TTAGGCATCCTATTCA-L8TX_180406_01_B01,1.4252352,9.514365 +10X_cells.CAGAGAGAGGATGGAA-L8TX_180406_01_D01,1.2725108,8.020793 +10X_cells.CCGTTCAGTCATGCAT-L8TX_180406_01_D01,1.3114816,8.259484 +10X_cells.GTTTCTATCATAAAGG-L8TX_180406_01_D01,-0.002306299,8.884017 +10X_cells.CCGTACTGTGGCCCTA-L8TX_180406_01_E01,1.2160734,8.874878 +10X_cells.GTGTTAGCAATCAGAA-L8TX_180406_01_E01,-0.07358432,10.315128 +10X_cells.GTCGGGTTCTAACTCT-L8TX_180406_01_C02,1.3618909,7.480631 +10X_cells.AGTGGGACAGCTCGAC-L8TX_180406_01_D02,-0.41934493,10.466111 +10X_cells.CAACCTCTCCTTGACC-L8TX_180406_01_D02,1.1174823,10.251827 +10X_cells.GTACGTAGTACCCAAT-L8TX_180406_01_D02,0.66174614,8.886463 +10X_cells.CTTTGCGCAAGAAGAG-L8TX_180221_01_D10,-0.74053955,10.463847 +10X_cells.TGGGAAGCATGCCACG-L8TX_180221_01_D10,-0.3206641,9.624924 +10X_cells.AGAGTGGTCACCATAG-L8TX_180221_01_E10,-0.11178778,11.972816 +10X_cells.ATCATCTGTACTTCTT-L8TX_180221_01_E10,0.20382147,11.685066 +10X_cells.CATGACAAGATAGTCA-L8TX_180221_01_E10,0.1654297,11.448841 +10X_cells.GATCGATTCTAAGCCA-L8TX_180221_01_E10,-0.19791609,10.715535 +10X_cells.TGCCAAATCGCATGAT-L8TX_180221_01_E10,-0.55524945,12.614625 +10X_cells.AACACGTGTTAGATGA-L8TX_180221_01_F10,1.2857089,9.587471 +10X_cells.ACCCACTGTAGCTTGT-L8TX_180221_01_F10,-0.27149367,10.995557 +10X_cells.CCGTGGACACTATCTT-L8TX_180221_01_F10,0.7257486,9.980088 +10X_cells.TAAACCGCAAACTGCT-L8TX_180221_01_F10,0.34965295,11.358459 +10X_cells.AACTGGTGTCAACATC-L8TX_180221_01_G10,0.72388136,8.706824 +10X_cells.GTGCATAGTATCAGTC-L8TX_180221_01_H10,-0.97009987,13.276041 +10X_cells.GCTTGAATCGGTTAAC-L8TX_180221_01_A11,0.042262215,8.40325 +10X_cells.TTTATGCTCGCCGTGA-L8TX_190312_01_G02,0.70799845,10.31528 +Smartseq_cells.SM-GE8XN_S002_E1-50,-1.2889227,13.464117 +10X_cells.GAATGAACATTTCACT-L8TX_180221_01_D11,-1.4942874,13.500646 +10X_cells.CGTCACTGTAATCGTC-L8TX_180221_01_F11,-0.21303831,9.732772 +10X_cells.TTGGCAAGTGATAAGT-L8TX_180221_01_F11,-0.1275427,9.158398 +10X_cells.CTTAGGACACGGTTTA-L8TX_180907_01_B12,-0.6280855,11.262834 +Smartseq_cells.SM-GE5US_S227_E1-50,-0.9111492,12.792163 +10X_cells.TGTATTCTCCCGACTT-L8TX_180926_01_D01,0.97763115,8.904892 +10X_cells.TTGGCAATCCTCCTAG-L8TX_180926_01_D01,-1.4581871,12.105241 +10X_cells.ATGAGGGTCCTACAGA-L8TX_180926_01_E01,-0.6994431,11.399741 +10X_cells.GGTGCGTCAAGTTAAG-L8TX_180926_01_F01,1.238919,8.941522 +10X_cells.ACATACGGTGCTAGCC-L8TX_181011_01_A03,-0.25044414,10.24247 +10X_cells.AGTGAGGCACCATCCT-L8TX_181011_01_A03,1.5682583,8.34188 +10X_cells.ATCACGACAATGGAGC-L8TX_181011_01_A03,0.055890948,11.682971 +10X_cells.CTGCCTAAGTCGCCGT-L8TX_181011_01_C03,1.4513341,9.268091 +Smartseq_cells.SM-GE91J_S374_E1-50,-1.2663794,14.829919 +10X_cells.CAGTCCTGTACTCAAC-L8TX_180712_01_E05,1.3596476,7.581041 +10X_cells.CGCTTCAAGTGCCAGA-L8TX_180712_01_E05,0.2801073,8.600899 +10X_cells.CTAGAGTGTAGGAGTC-L8TX_180712_01_E05,1.3461038,9.873543 +10X_cells.GTGCATATCCTGTACC-L8TX_180712_01_F05,1.2382898,7.8089705 +10X_cells.TGACAACGTCTCTTAT-L8TX_180712_01_F05,0.7377583,10.293258 +10X_cells.TTCTCAATCATATCGG-L8TX_180712_01_F05,1.1489117,10.464642 +10X_cells.CGGAGCTTCAGTCCCT-L8TX_180712_01_H05,1.6118237,9.652283 +10X_cells.AAGGTTCGTGGTAACG-L8TX_180712_01_A06,1.6847122,8.6095295 +10X_cells.ACACCGGAGGTGCACA-L8TX_180712_01_A06,1.4256685,9.363589 +10X_cells.CAGATCAAGACAGGCT-L8TX_180712_01_A06,-0.3507328,12.162732 +10X_cells.CATCGGGGTTCTCATT-L8TX_180712_01_A06,0.13018318,11.460881 +10X_cells.CGAACATGTTTAGGAA-L8TX_180712_01_A06,-3.1023042,6.8937097 +10X_cells.CGGGTCAAGTCATGCT-L8TX_180712_01_A06,0.23215036,10.693275 +10X_cells.CCGGTAGTCAGGTTCA-L8TX_180504_01_E01,1.6675446,9.672503 +10X_cells.GCGCAACAGAAGGTGA-L8TX_180504_01_E01,1.3366764,9.474046 +10X_cells.GCTGCGAAGTATGACA-L8TX_180504_01_E01,1.6939553,8.266051 +10X_cells.TTATGCTGTACAGTGG-L8TX_180504_01_E01,1.3099366,9.129773 +10X_cells.CAGGTGCTCGTAGATC-L8TX_180221_01_A12,-0.15749295,8.080454 +10X_cells.GGGAATGAGTTCGATC-L8TX_180221_01_A12,-0.57514644,6.8464127 +10X_cells.TCAGCAACAAAGGTGC-L8TX_180221_01_A12,-0.18536252,11.9095545 +10X_cells.CGGACACCAAGAAGAG-L8TX_180221_01_C12,-0.07002689,7.7688437 +10X_cells.GACCAATCAACCGCCA-L8TX_180221_01_C12,0.6679322,8.707458 +10X_cells.GTCCTCACAATGGTCT-L8TX_180221_01_C12,1.3303356,8.207446 +10X_cells.CGGACGTCAACACCTA-L8TX_180221_01_H11,-0.4348687,7.2476544 +10X_cells.TATGCCCCATGAGCGA-L8TX_180221_01_H11,-0.27148697,7.974705 +10X_cells.CACAGTAGTATATCCG-L8TX_200611_02_A05,0.33064017,11.412088 +10X_cells.CGTCCATAGACTGTAA-L8TX_200611_02_A05,-0.8793672,12.746804 +10X_cells.CGTTCTGCACATCCAA-L8TX_200611_02_A05,1.2977425,9.925064 +10X_cells.GACCAATTCGGCTACG-L8TX_200611_02_A05,-0.3802842,11.650047 +10X_cells.GTACGTATCTGGAGCC-L8TX_200611_02_A05,0.18724471,11.6608 +Smartseq_cells.SM-GE679_S058_E1-50,-0.8580575,13.994471 +10X_cells.TAAGAGATCTGTCCGT-L8TX_180115_01_A09,-0.9210191,12.594918 +10X_cells.CGATTGAGTGACAAAT-L8TX_180115_01_B09,-0.5848086,9.3356085 +10X_cells.ACACCCTTCGTTTAGG-L8TX_180115_01_D09,1.2275733,8.676935 +10X_cells.CTGATCCTCCATGCTC-L8TX_180115_01_D09,-2.1190972,14.200328 +10X_cells.CTGCTGTCACTTCGAA-L8TX_180115_01_D10,-0.938343,7.197107 +10X_cells.GGGACCTTCGGTTCGG-L8TX_180115_01_D10,-1.3908354,7.43325 +10X_cells.CAGCCGACATTGCGGC-L8TX_180115_01_A11,-0.817038,12.119373 +10X_cells.ACTGTCCCATGCTAGT-L8TX_180115_01_H10,0.1476942,10.700082 +10X_cells.GTATCTTCAGAGCCAA-L8TX_180115_01_H10,-0.8084727,11.21106 +10X_cells.CAGAATCCAAACCCAT-L8TX_180115_01_B11,-2.4800768,11.18641 +10X_cells.CGTGAGCGTGCACTTA-L8TX_180115_01_B11,0.3171936,10.491555 +10X_cells.AATCCAGTCCTCAACC-L8TX_180115_01_D11,-0.59173477,10.221683 +10X_cells.CGCTATCAGCCCGAAA-L8TX_180115_01_D11,0.48690918,10.821769 +10X_cells.GGGAGATGTTAAGGGC-L8TX_180115_01_D11,-0.68473494,11.954704 +10X_cells.GGGATGACATCTGGTA-L8TX_180115_01_E10,-1.2162732,10.368509 +10X_cells.AATCGGTTCTATCGCC-L8TX_180115_01_F10,-1.0685441,9.552058 +10X_cells.ACTTACTGTGAAAGAG-L8TX_180115_01_F10,-0.9178308,10.386912 +10X_cells.TTCGAAGGTCGATTGT-L8TX_180115_01_F10,-0.3759131,12.0021515 +10X_cells.TTGTAGGAGTGTGAAT-L8TX_180115_01_F10,-0.42827526,9.795174 +10X_cells.CGCTTCAGTGCCTTGG-L8TX_180115_01_G10,0.12764756,9.032816 +10X_cells.GGACAAGTCTTGAGAC-L8TX_180115_01_G10,-1.0351095,7.641929 +10X_cells.GTGTTAGGTTGCGTTA-L8TX_180115_01_G10,-1.2126348,11.685581 +10X_cells.GGAATAAGTATGCTTG-L8TX_180115_01_E11,-0.89926994,11.222654 +10X_cells.GGCGACTAGGAGCGAG-L8TX_180115_01_E11,-1.3808497,9.946446 +10X_cells.AGAGTGGCAGCTATTG-L8TX_180115_01_F11,-0.63614744,11.762977 +10X_cells.AGATCTGCAGTATCTG-L8TX_180115_01_F11,0.5455347,8.677739 +10X_cells.CTGGTCTCAAGTCTAC-L8TX_180115_01_F11,-2.208723,13.367242 +10X_cells.GATCGCGTCACAACGT-L8TX_180115_01_F11,-1.57166,12.683115 +10X_cells.GCGCAGTAGATAGCAT-L8TX_180115_01_G11,0.5473186,8.787818 +10X_cells.ATGCGATCATCACGAT-L8TX_180115_01_F09,0.24129559,9.935233 +10X_cells.ATTTCTGAGTGTACTC-L8TX_180115_01_F09,-1.1419498,10.948907 +10X_cells.CTCGAAAGTCATGCCG-L8TX_171120_01_G07,3.187938,9.847251 +10X_cells.GGTGTTAAGCCGGTAA-L8TX_171120_01_H07,1.532834,8.6591 +10X_cells.ATAGACCAGTGGGTTG-L8TX_180115_01_D08,-1.1504834,13.733241 +10X_cells.ACGGCCATCACCATAG-L8TX_171120_01_C07,-0.13221836,10.70653 +10X_cells.GGCCGATGTCCATGAT-L8TX_171120_01_C07,-0.0367146,11.728474 +10X_cells.GTGAAGGCATTGAGCT-L8TX_171120_01_C07,-1.857078,13.587051 +10X_cells.AAGCCGCAGGATCGCA-L8TX_171120_01_D07,1.5100502,8.8117 +10X_cells.ACCGTAAGTTAGGGTG-L8TX_171120_01_F07,-0.9558214,12.084027 +10X_cells.TCAGGTAAGCAGCCTC-L8TX_180115_01_E08,-0.60235506,11.827379 +Smartseq_cells.LS-15006_S48_E1-50,-0.9287983,12.7508955 +Smartseq_cells.LS-15066_S34_E1-50,-1.6845728,14.262515 +Smartseq_cells.LS-15068_S80_E1-50,-0.60368466,13.455406 +Smartseq_cells.LS-15075_S27_E1-50,-0.9029805,13.680515 +Smartseq_cells.LS-15097_S17_E1-50,-1.1156802,14.008928 +Smartseq_cells.LS-15366_S47_E1-50,-1.6017257,14.275895 +Smartseq_cells.LS-15545_S68_E1-50,-1.9385715,14.453032 +Smartseq_cells.LS-15546_S11_E1-50,-1.821909,13.758601 +Smartseq_cells.SM-D9E63_S39_E1-50,0.11958508,13.278878 +Smartseq_cells.SM-DD45I_S006_E1-50,-1.2920977,13.880834 +Smartseq_cells.SM-GE635_S045_E1-50,-2.5010026,13.634577 +10X_cells.TGGCGCAAGGACACCA-L8TX_180406_01_C06,1.3272073,13.410168 +10X_cells.GTTAAGCGTTTGACAC-L8TX_180221_01_F09,1.3129189,12.256799 +10X_cells.ATAAGAGCATGAAGTA-L8TX_180221_01_H09,1.14227,12.115167 +10X_cells.GTACTTTTCTTGTACT-L8TX_180221_01_H09,0.432881,10.600093 +10X_cells.TGTTCCGAGTCCATAC-L8TX_180221_01_H09,0.15049864,12.096163 +10X_cells.CTTTGCGGTGCATCTA-L8TX_180221_01_A10,0.16518684,11.204072 +10X_cells.AAGACCTGTGCGCTTG-L8TX_180221_01_B10,5.8875346,5.4437423 +10X_cells.ATAACGCTCGCAAACT-L8TX_180221_01_B10,4.006805,3.560618 +10X_cells.AACACGTCAGCGATCC-L8TX_180221_01_C10,3.9495823,5.288297 +10X_cells.CATCGGGTCTAACGGT-L8TX_180221_01_C10,0.62164474,11.707931 +10X_cells.GATGAGGGTATATGGA-L8TX_180221_01_C10,4.6825814,3.1174448 +10X_cells.GCAGTTATCGTTTAGG-L8TX_180221_01_C10,0.7330735,10.10249 +10X_cells.GTAACTGAGGCTCTTA-L8TX_180221_01_C10,0.6598381,13.386842 +10X_cells.TGTGTTTAGTGCAAGC-L8TX_180221_01_C10,1.6666775,11.331394 +10X_cells.CTGCGGAAGTACGTAA-L8TX_180406_01_C06,-0.058115423,14.992666 +10X_cells.TAGTTGGCAAGTTCTG-L8TX_180406_01_C06,0.8963717,10.866363 +Smartseq_cells.SM-GE63W_S025_E1-50,1.0034956,13.397818 +10X_cells.ACGTCAACACCCAGTG-L8TX_180607_01_C05,0.77539295,13.024864 +10X_cells.AGCCTAAAGGTGCTTT-L8TX_180221_01_H12,1.1756591,11.710358 +10X_cells.CACATTTAGCTCAACT-L8TX_180221_01_H12,1.6720586,13.0137005 +10X_cells.CGGGTCAAGTACATGA-L8TX_180221_01_H12,0.7856433,11.422029 +10X_cells.GATGAAATCTCTGAGA-L8TX_180221_01_H12,2.2731192,4.715479 +10X_cells.GCGCGATAGCTAACTC-L8TX_180221_01_H12,0.31858703,10.251754 +10X_cells.ACGATGTTCCGAATGT-L8TX_180221_01_E09,0.83049417,11.036514 +10X_cells.CAGATCACACACCGCA-L8TX_180221_01_E09,0.31072047,11.986101 +10X_cells.GCCAAATAGACCTAGG-L8TX_180221_01_E09,1.3727425,12.7572565 +10X_cells.CACATAGAGGTGACCA-L8TX_180221_01_C09,-1.0226789,8.796072 +10X_cells.GGAACTTGTTTAGCTG-L8TX_180221_01_C09,4.668552,2.5798886 +10X_cells.GTTCATTAGTCGCCGT-L8TX_180221_01_C09,-0.5343169,13.768087 +10X_cells.TGAGGGAGTGTAACGG-L8TX_180221_01_C09,1.0648509,9.766721 +10X_cells.ACGGAGACAACTGCGC-L8TX_180221_01_D09,-0.5007321,9.685312 +10X_cells.ATTGGTGTCACCTCGT-L8TX_180221_01_D09,4.8321385,2.721272 +10X_cells.CTGTTTAAGCCAGAAC-L8TX_180221_01_D09,0.6018997,9.807589 +10X_cells.GCTTGAATCGAGAGCA-L8TX_180221_01_D09,4.7985373,2.434999 +10X_cells.CATATGGCACAGCGTC-L8TX_180607_01_C05,1.9920958,11.621373 +10X_cells.TGTGTTTCATAAAGGT-L8TX_180607_01_C05,1.253342,10.466417 +10X_cells.AGCTTGAAGGGAAACA-L8TX_180712_01_G05,0.7201554,11.893232 +10X_cells.CACATTTCACTCAGGC-L8TX_180712_01_G05,-2.2676272,13.0869665 +10X_cells.GTTCGGGCACAACTGT-L8TX_180712_01_G05,-0.95621514,14.342907 +10X_cells.TTGCCGTCATGTCCTC-L8TX_180712_01_G05,1.1170057,12.25845 +10X_cells.AAGACCTTCTTCTGGC-L8TX_180712_01_B06,1.4318959,10.232472 +10X_cells.AGTGGGAGTTGATTGC-L8TX_180712_01_B06,1.1384608,11.582105 +10X_cells.CAACTAGTCCCAAGAT-L8TX_180712_01_B06,0.26714742,11.541825 +10X_cells.CAAGGCCGTCCAGTGC-L8TX_180712_01_B06,1.7045108,11.207895 +10X_cells.CTGCGGATCAGTTCGA-L8TX_180712_01_B06,1.7538127,11.492659 +10X_cells.GGACAAGTCCACTGGG-L8TX_180712_01_B06,0.87834704,10.017009 +10X_cells.ACGGGCTCATCCAACA-L8TX_180712_01_C06,1.1533574,13.948555 +10X_cells.ATCATCTTCTGAGGGA-L8TX_180712_01_C06,2.7950642,11.723848 +Smartseq_cells.LS-15087_S43_E1-50,0.67578286,13.833107 +Smartseq_cells.LS-15315_S75_E1-50,0.85837066,13.758047 +Smartseq_cells.LS-15361_S12_E1-50,1.6691741,12.53286 +Smartseq_cells.SM-D9EPG_S53_E1-50,-1.4983809,14.514633 +Smartseq_cells.SM-D9EPG_S65_E1-50,0.75765693,14.001434 +Smartseq_cells.SM-D9D13_S95_E1-50,1.0068023,13.274902 +Smartseq_cells.SM-D9D7P_S41_E1-50,0.1669758,15.028841 +Smartseq_cells.SM-D9D9E_S66_E1-50,2.043459,11.653967 +10X_cells.ATCTACTAGCCGTCGT-L8TX_180829_01_D09,2.1032746,9.200741 +10X_cells.AGCGTATGTGATGATA-L8TX_180829_01_E10,-1.146705,10.939102 +10X_cells.GCGCGATAGACTCGGA-L8TX_180907_01_G10,0.6404895,9.854059 +10X_cells.GTAACTGAGCGATTCT-L8TX_181011_01_H02,0.60030186,10.092861 +10X_cells.TACGGTAAGCTGCGAA-L8TX_181011_01_C04,0.6028372,11.456785 +10X_cells.AACACGTAGATGTAAC-L8TX_181012_01_G04,0.71125233,11.1755295 +10X_cells.CCGTACTCACTTAAGC-L8TX_181012_01_G04,-1.7373077,12.88894 +10X_cells.CGTGTCTAGCACAGGT-L8TX_181012_01_G04,0.15336592,9.9368725 +10X_cells.ACACCCTAGAGTCGGT-L8TX_180406_01_H01,1.4943619,7.0223417 +10X_cells.CACATAGAGGTGTTAA-L8TX_180406_01_H01,1.967461,9.554828 +10X_cells.GGACGTCGTATTCTCT-L8TX_180406_01_H01,0.99088156,7.754304 +10X_cells.TAGAGCTGTCTCACCT-L8TX_180406_01_H01,2.6608877,10.932471 +10X_cells.AATCGGTAGACCTAGG-L8TX_180406_01_E02,1.4343942,7.7788763 +10X_cells.GAACGGACAGACGCAA-L8TX_180406_01_E02,1.3578063,8.700712 +10X_cells.GTCTCGTAGAATGTTG-L8TX_180406_01_E02,1.7230338,8.987224 +10X_cells.TGAGAGGTCTATCCTA-L8TX_180406_01_E02,1.0227659,9.832141 +10X_cells.ACGGGTCCACTATCTT-L8TX_180406_01_G02,1.4951693,7.765393 +10X_cells.CTGTTTAAGCCACGTC-L8TX_180406_01_G02,1.4436417,7.737489 +10X_cells.GGCGACTTCTTGCCGT-L8TX_180406_01_G02,1.239853,10.476439 +10X_cells.CATATTCGTCTAGCCG-L8TX_180406_01_B06,0.23395295,9.660929 +10X_cells.CACAGTAGTCAAAGAT-L8TX_180406_01_C08,1.6576651,7.018954 +10X_cells.GTACGTAGTATTACCG-L8TX_180406_01_C08,1.6726258,8.731758 +10X_cells.ACTGAGTGTCGAATCT-L8TX_180406_01_C07,0.59373873,7.833993 +10X_cells.CCTCTGACACCTTGTC-L8TX_180406_01_C07,0.027152387,8.069737 +Smartseq_cells.SM-GE5V5_S152_E1-50,4.17022,3.9982126 +Smartseq_cells.SM-GE5V6_S157_E1-50,0.82882375,13.089935 +10X_cells.GCATACAGTGAGTATA-L8TX_180221_01_F12,1.8071707,9.054556 +10X_cells.AAACCTGAGCGATTCT-L8TX_200625_02_F11,0.87589645,12.273182 +10X_cells.TACTCATAGGTGATTA-L8TX_171026_01_A05,0.14872539,15.741414 +10X_cells.CACCTTGTCAGGCCCA-L8TX_171026_01_F03,-0.32851413,15.400412 +10X_cells.CCTACACAGCAGACTG-L8TX_171026_01_F03,-0.14866823,15.161017 +10X_cells.GCCTCTAGTGCACTTA-L8TX_171026_01_F03,-0.0909332,14.335457 +10X_cells.GCGGGTTGTCAAAGAT-L8TX_171026_01_G03,1.1850736,13.402964 +10X_cells.GTGTTAGTCGCATGGC-L8TX_171026_01_G03,-1.7730631,13.628519 +10X_cells.GTTAAGCGTGAAGGCT-L8TX_171026_01_G03,-0.5125821,13.617424 +10X_cells.CCCAGTTGTGCGGTAA-L8TX_171026_01_B04,-0.6404175,12.747072 +10X_cells.CTACCCACATTTGCTT-L8TX_171026_01_F04,1.5738868,13.063643 +10X_cells.CTCACACGTAGCAAAT-L8TX_171026_01_F04,-0.6017946,14.361512 +10X_cells.TTAGTTCCACAAGTAA-L8TX_171026_01_G04,0.481537,11.635906 +10X_cells.CACCTTGGTATCAGTC-L8TX_171026_01_H04,-0.92060876,14.895004 +10X_cells.ATCCGAAGTCGGCTCA-L8TX_171026_01_A05,0.14977022,12.882574 +10X_cells.CAACTAGGTGTGTGCC-L8TX_171026_01_H03,-3.0193303,13.889797 +10X_cells.ATGGGAGTCCTGCTTG-L8TX_171026_01_A04,1.8321322,12.4473295 +10X_cells.CTGTGCTGTAGAAAGG-L8TX_171026_01_A04,0.56363827,11.719257 +10X_cells.GTGAAGGGTTCGTTGA-L8TX_171026_01_A04,-0.433254,12.32496 +10X_cells.CTGATAGTCCACGTGG-L8TX_171026_01_C05,0.2973989,10.702295 +10X_cells.GCGAGAAGTACAGACG-L8TX_171026_01_D05,1.719205,12.403073 +10X_cells.TCCCGATTCCAGAAGG-L8TX_171026_01_D05,0.32120636,11.983627 +10X_cells.CTGAAACGTTGTTTGG-L8TX_171026_01_E05,0.5091751,10.3682785 +10X_cells.GAGCAGATCGACCAGC-L8TX_171026_01_E05,-1.0058033,14.156229 +10X_cells.GTCGTAACACGGTAGA-L8TX_171026_01_E05,-0.739657,13.567198 +10X_cells.TGAGGGAGTATTAGCC-L8TX_171026_01_E05,1.7851026,12.236381 +10X_cells.GACGGCTAGACGCACA-L8TX_171026_01_F05,-0.18625787,12.91218 +10X_cells.GCTTCCAAGATGCCAG-L8TX_171026_01_G05,-1.0905625,11.738451 +10X_cells.GGATTACTCTATCGCC-L8TX_171026_01_G05,0.9887641,11.937674 +10X_cells.CAACTAGTCGCTAGCG-L8TX_171026_01_H05,0.09469947,10.527724 +Smartseq_cells.SM-GE67S_S041_E1-50,-0.19974025,13.561309 +Smartseq_cells.SM-GE67S_S085_E1-50,-1.1845512,14.834768 +Smartseq_cells.SM-GE67S_S096_E1-50,-2.0077605,14.173148 +Smartseq_cells.SM-GE92L_S154_E1-50,-2.0534472,14.137003 +Smartseq_cells.SM-GE92L_S165_E1-50,-0.24850792,14.745381 +Smartseq_cells.SM-GE8ZH_S363_E1-50,0.23099196,13.148595 +10X_cells.CGAGCCAGTTTGCATG-L8TX_180406_01_B01,1.6986955,9.081582 +10X_cells.CTCCTAGAGTGGGTTG-L8TX_180406_01_D01,1.594369,8.365427 +10X_cells.AAGGCAGTCTGATACG-L8TX_180406_01_E01,0.8939124,9.904133 +10X_cells.CGGACACGTATAAACG-L8TX_180406_01_F01,0.748431,9.049915 +10X_cells.GGGAGATCAGTTCCCT-L8TX_180406_01_B02,1.5010008,7.6813335 +10X_cells.ACGATGTGTCTTCAAG-L8TX_180406_01_C02,2.6635628,10.850473 +10X_cells.CACACCTTCCTAGAAC-L8TX_180406_01_C02,1.7417336,9.9858465 +10X_cells.CAAGAAATCCGAACGC-L8TX_180406_01_D02,0.68110085,8.909171 +Smartseq_cells.SM-GE66Z_S092_E1-50,0.47470248,13.633816 +Smartseq_cells.SM-GE671_S169_E1-50,2.070017,11.461508 +Smartseq_cells.SM-GE8Z7_S001_E1-50,3.8631172,10.927093 +10X_cells.ATAAGAGTCACATGCA-L8TX_180221_01_F10,1.443509,13.456939 +10X_cells.ACGTCAATCTAACCGA-L8TX_180221_01_F10,1.4211303,13.636172 +10X_cells.TGTTCCGGTATCTGCA-L8TX_180221_01_D10,0.86487794,11.304389 +10X_cells.ATGTGTGAGGACCACA-L8TX_180221_01_E10,1.5855497,13.524916 +10X_cells.CAGCCGAGTCAGGACA-L8TX_180221_01_E10,1.6640722,8.990428 +10X_cells.CCTACCATCACAGTAC-L8TX_180221_01_E10,0.72785836,8.867804 +10X_cells.GAACATCCAGGTCGTC-L8TX_180221_01_E10,0.113639824,11.242655 +10X_cells.GGAGCAAAGCTAGGCA-L8TX_180221_01_E10,1.1352705,11.717731 +10X_cells.GGGCATCAGAGACTTA-L8TX_180221_01_E10,1.2209249,12.783484 +10X_cells.CACAGGCCATGTAAGA-L8TX_180221_01_F10,-0.23972067,13.19473 +10X_cells.GTGTTAGTCATCTGTT-L8TX_180221_01_F10,3.3930988,2.0682683 +10X_cells.CCCATACCAAAGTCAA-L8TX_180221_01_G10,1.1855893,12.5126295 +10X_cells.CGGAGTCAGATGTGTA-L8TX_180221_01_G10,0.06610533,14.850911 +10X_cells.GAGCAGACAAGCGCTC-L8TX_180221_01_G10,1.7329053,8.923978 +10X_cells.GCACATAGTTACGGAG-L8TX_180221_01_G10,0.33231664,12.432249 +10X_cells.ACACTGATCCAGATCA-L8TX_180221_01_H10,-1.652786,14.470421 +10X_cells.AGCTCCTGTCGGCTCA-L8TX_180221_01_H10,1.7423173,11.760238 +10X_cells.GATCTAGCATGCCCGA-L8TX_180221_01_A11,1.706157,9.024177 +10X_cells.ACGGGTCTCATCTGCC-L8TX_190312_01_B02,4.506398,2.5351381 +10X_cells.CACCACTAGATAGTCA-L8TX_190312_01_B02,4.4513693,3.469889 +10X_cells.CTCCTAGAGGCTAGGT-L8TX_190312_01_B02,4.2385287,3.8398926 +10X_cells.GAAATGAGTTCCACTC-L8TX_190312_01_B02,1.6710515,11.159431 +10X_cells.GTCTCGTCAATGGACG-L8TX_190312_01_B02,3.6419578,9.022099 +10X_cells.TGTCCCACAATGGACG-L8TX_190312_01_B02,2.0694792,11.810103 +10X_cells.GAGCAGACAAGCTGAG-L8TX_190312_01_C02,3.62884,2.3591032 +10X_cells.CCCATACAGTGAACAT-L8TX_190312_01_D02,1.0286527,12.3700075 +10X_cells.CATGCCTCATCTCGCT-L8TX_190312_01_G02,1.4031398,11.073899 +10X_cells.ATCATCTTCTAAGCCA-L8TX_180907_01_B11,0.45613688,11.595944 +10X_cells.CACACAATCCAGTATG-L8TX_180907_01_B11,-1.1335627,11.624192 +10X_cells.ATCCGAATCAACTCTT-L8TX_180221_01_C11,0.59655195,10.167042 +10X_cells.CAGGTGCGTCCAGTGC-L8TX_180221_01_C11,-0.5697283,10.52581 +10X_cells.ACATGGTCAGATAATG-L8TX_190312_01_A03,1.185448,12.679961 +Smartseq_cells.SM-GE67O_S059_E1-50,1.0693673,12.612714 +10X_cells.ATAACGCCAAGAAGAG-L8TX_180907_01_E11,4.6784344,2.8305318 +Smartseq_cells.SM-DD44A_S80_E1-50,-1.3872812,15.0216055 +Smartseq_cells.SM-GE5UT_S293_E1-50,1.8091846,12.120232 +10X_cells.GAGGTGAAGCTACCTA-L8TX_180926_01_B01,1.9323105,13.097229 +10X_cells.CAAGATCAGTGGTAGC-L8TX_180926_01_B01,1.228137,10.5009575 +10X_cells.ACGTCAAAGACGCTTT-L8TX_180926_01_D01,4.190536,2.21049 +10X_cells.GATCTAGCATCTATGG-L8TX_180926_01_D01,0.35730022,9.923662 +10X_cells.ATCGAGTAGCAGACTG-L8TX_180926_01_E01,0.62906903,10.188514 +10X_cells.CAACTAGCATCAGTAC-L8TX_180926_01_E01,1.8617808,11.954303 +10X_cells.CTGCGGAGTACCGCTG-L8TX_180926_01_E01,0.79707676,10.234332 +10X_cells.TTTGGTTGTGATGCCC-L8TX_180926_01_E01,1.6675354,12.779678 +10X_cells.CACATAGCACCTCGTT-L8TX_180926_01_F01,1.8363783,9.621744 +10X_cells.GGGAATGAGCGTCTAT-L8TX_180926_01_F01,1.229903,12.25344 +10X_cells.CAACTAGCACGTGAGA-L8TX_181011_01_B03,1.3803389,11.24504 +10X_cells.AAGCCGCTCGAATGCT-L8TX_181011_01_H03,0.7499955,11.907214 +10X_cells.CCTCTGACAAACTGTC-L8TX_181011_01_H03,1.0882065,8.81786 +10X_cells.GGCGTGTGTGTGAATA-L8TX_181011_01_H03,-1.9803915,9.852667 +10X_cells.TGAGGGACACATTCGA-L8TX_180221_01_D12,1.7284896,12.813662 +10X_cells.CAACCAACACATCCAA-L8TX_180712_01_E05,1.2489085,7.436243 +10X_cells.GATCGATGTCGCATAT-L8TX_180712_01_E05,1.5729173,8.828691 +10X_cells.TCAATCTTCGCTTAGA-L8TX_180712_01_E05,0.49076527,8.436352 +10X_cells.CGCGGTAGTCTGCAAT-L8TX_180712_01_H05,1.1610477,11.758584 +10X_cells.TCAGCAATCGCCAAAT-L8TX_180712_01_H05,0.65753174,10.417182 +10X_cells.TGAAAGACAAGTTCTG-L8TX_180712_01_H05,1.5193808,8.721297 +10X_cells.AAGGAGCTCTAACTGG-L8TX_180712_01_A06,-0.38870382,10.018493 +10X_cells.ATCACGAGTAAGGATT-L8TX_180712_01_A06,0.9080644,11.55776 +10X_cells.ATGGGAGTCCCGGATG-L8TX_180712_01_A06,2.2099936,11.450845 +10X_cells.CATCAAGGTTAGATGA-L8TX_180712_01_A06,1.0760047,11.764977 +10X_cells.CGCCAAGTCTACTATC-L8TX_180712_01_A06,1.4177932,9.525605 +10X_cells.AAGGCAGTCAGTGCAT-L8TX_180504_01_E01,1.6456859,8.671603 +10X_cells.ACTGAACTCAGTACGT-L8TX_180504_01_E01,0.3487918,9.043709 +10X_cells.TGCCCTAGTTAAGGGC-L8TX_180504_01_E01,3.413741,2.618643 +10X_cells.AACTCAGAGTGGCACA-L8TX_180221_01_A12,0.48848805,9.288112 +10X_cells.ACAGCTAGTTTCCACC-L8TX_180221_01_A12,0.5726859,9.386641 +10X_cells.GGAATAATCTTTCCTC-L8TX_180221_01_B12,0.6483317,10.486238 +10X_cells.GTTTCTAAGGCCCGTT-L8TX_180221_01_C12,1.732788,8.982206 +10X_cells.AAACCTGTCACGGTTA-L8TX_180221_01_H11,0.71475655,10.453452 +10X_cells.ACCCACTAGTGAATTG-L8TX_180221_01_H11,0.5325906,9.284379 +10X_cells.GGAAAGCCACTAGTAC-L8TX_180221_01_H11,0.641362,10.896656 +10X_cells.TGTGTTTTCCGTCATC-L8TX_180221_01_H11,0.6602097,10.580983 +10X_cells.AACGTTGTCCGTCAAA-L8TX_200611_02_A05,0.5827895,10.282149 +10X_cells.CACCTTGGTACCTACA-L8TX_200611_02_A05,0.5213371,10.953635 +10X_cells.CATATTCGTCTAGTCA-L8TX_200611_02_A05,1.4001749,10.040153 +10X_cells.TAGGCATCACTTAAGC-L8TX_200611_02_A05,0.8854586,11.221404 +10X_cells.TCGGGACGTCACTTCC-L8TX_200611_02_A05,0.51918036,9.639728 +Smartseq_cells.SM-GE679_S142_E1-50,1.1368159,12.599781 +Smartseq_cells.SM-GE91C_S142_E1-50,-1.084127,12.978272 +10X_cells.CCTTCGATCCGTCATC-L8TX_180115_01_C09,-0.6260956,11.196114 +10X_cells.CGCCAAGAGGAGTACC-L8TX_180115_01_C09,0.25519904,9.473871 +10X_cells.TCCCGATAGCCCAACC-L8TX_180115_01_H10,1.028198,11.582144 +10X_cells.GGATGTTCACTCGACG-L8TX_180115_01_B10,1.655171,11.127873 +10X_cells.ATTTCTGAGGATATAC-L8TX_180115_01_B11,2.8565474,13.284261 +10X_cells.CTACGTCAGACTGTAA-L8TX_180115_01_C10,1.2931325,10.825075 +10X_cells.AAAGATGAGAAGAAGC-L8TX_180115_01_C11,0.5991757,9.949995 +10X_cells.ATTCTACCACAGCCCA-L8TX_180115_01_C11,-1.6031477,9.303526 +10X_cells.ACTTTCATCATCGGAT-L8TX_180115_01_D11,0.73115945,11.564839 +10X_cells.GAAATGAAGACAAGCC-L8TX_180115_01_D11,-0.013642284,12.16954 +10X_cells.GCTCCTAGTTGTCTTT-L8TX_180115_01_D11,0.4086578,11.603941 +10X_cells.TACCTATGTCATACTG-L8TX_180115_01_D11,-4.03641,6.87563 +10X_cells.TGAGAGGAGCCCTAAT-L8TX_180115_01_D11,0.3831468,12.84813 +10X_cells.ATTTCTGGTTCCCGAG-L8TX_180115_01_F10,0.7037867,9.87885 +10X_cells.CAGATCAGTAACGTTC-L8TX_180115_01_E11,-0.33202296,8.1767435 +10X_cells.CCTTCGATCCTCAATT-L8TX_180115_01_E11,1.1488545,12.040903 +10X_cells.GCAAACTTCGCACTCT-L8TX_180115_01_E11,0.53247017,12.777829 +10X_cells.CGAGCCAGTATTCGTG-L8TX_180115_01_F11,3.56101,2.4530997 +10X_cells.GTAACGTCAACACCCG-L8TX_180115_01_H09,0.8807426,9.707727 +10X_cells.GGAACTTGTGTTAAGA-L8TX_180115_01_A10,1.4402928,9.989825 +10X_cells.ACTGCTCCACGCATCG-L8TX_180115_01_E09,2.2878118,9.572934 +10X_cells.ACGGGCTCACAGCGTC-L8TX_180115_01_F09,0.7518326,12.384068 +10X_cells.GTTCGGGAGACTCGGA-L8TX_171120_01_H07,0.71649677,11.050607 +10X_cells.CGAATGTTCTTCGAGA-L8TX_180115_01_G08,0.07890071,11.237062 +10X_cells.GACCAATCAAGCTGTT-L8TX_171120_01_C07,-0.19232196,11.928647 +10X_cells.TTCGGTCAGCCACCTG-L8TX_171120_01_C07,1.0406005,12.362309 +Smartseq_cells.LS-15060_S72_E1-50,-0.66685325,13.785938 +Smartseq_cells.LS-15074_S34_E1-50,0.38527375,13.650327 +Smartseq_cells.LS-15074_S64_E1-50,1.5666356,12.372336 +Smartseq_cells.LS-15352_S71_E1-50,-2.413574,14.673837 +Smartseq_cells.LS-15515_S12_E1-50,-1.18346,14.542133 +Smartseq_cells.LS-15545_S65_E1-50,0.076767094,13.851291 +Smartseq_cells.SM-D9E4K_S05_E1-50,-1.146698,14.401961 +Smartseq_cells.SM-D9E63_S40_E1-50,0.93440896,12.766848 +Smartseq_cells.SM-GE64U_S033_E1-50,0.07347437,15.078425 +Smartseq_cells.SM-GE67S_S021_E1-50,-2.280953,14.187898 +Smartseq_cells.SM-GE67T_S003_E1-50,-0.6167185,15.096603 +Smartseq_cells.SM-GE67T_S026_E1-50,1.588221,13.609075 +Smartseq_cells.SM-GE91G_S347_E1-50,5.90282,3.734032 +Smartseq_cells.SM-GE91J_S028_E1-50,4.967916,5.018558 +Smartseq_cells.SM-GE93M_S175_E1-50,6.1886754,4.0245366 +10X_cells.CCGTGGAAGGCTCATT-L8TX_180221_01_C09,1.5907595,6.9398193 +10X_cells.ACATGGTTCTCACATT-L8TX_181012_01_H04,1.3921932,7.2363048 +10X_cells.GCGCAGTGTGTTAAGA-L8TX_180406_01_B06,1.485331,6.988332 +10X_cells.ATTATCCAGCGTGAGT-L8TX_180406_01_C07,1.7971652,7.068902 +10X_cells.TGCCCTAAGGCAATTA-L8TX_180406_01_H02,0.13243373,7.667052 +10X_cells.CTTAACTTCGAACGGA-L8TX_180406_01_H01,1.1475452,7.591439 +10X_cells.GGCTGGTGTTGCGTTA-L8TX_180406_01_C07,-0.38516334,8.197134 +10X_cells.ACCTTTACATGGTTGT-L8TX_180406_01_C07,1.5652965,7.396499 +10X_cells.CTGCCTAGTCCATCCT-L8TX_180406_01_B06,1.30038,7.6706777 +10X_cells.CCTATTAGTCATATGC-L8TX_180406_01_H01,0.3350583,7.3418536 +10X_cells.TGACAACTCTCCCTGA-L8TX_180406_01_C07,1.6279279,6.982693 +10X_cells.TGCACCTCATTGGGCC-L8TX_180406_01_H01,1.3882157,7.5233383 +10X_cells.TGAGGGATCCGCGGTA-L8TX_180406_01_E02,-0.24895404,8.086415 +10X_cells.TTTGCGCAGGACCACA-L8TX_180406_01_E02,1.4853635,7.4930344 +10X_cells.CCCAATCGTCATCCCT-L8TX_180406_01_H02,-2.022239,7.1137576 +10X_cells.ATTACTCGTACCGGCT-L8TX_180406_01_H01,-0.57187563,8.5735235 +10X_cells.GCTGCAGCAATGTTGC-L8TX_180406_01_C07,-1.501147,8.823389 +10X_cells.TACAGTGCACTTAACG-L8TX_180406_01_H02,1.3825107,6.5842166 +10X_cells.CGAGCCAAGTTTAGGA-L8TX_180406_01_E06,0.7144525,7.475485 +10X_cells.GTGTTAGCACGTAAGG-L8TX_180406_01_C07,1.0033437,7.504681 +10X_cells.CGTTAGATCTTAACCT-L8TX_180406_01_C07,-0.93766016,8.066579 +10X_cells.TACTCATTCCAACCAA-L8TX_180406_01_B06,-1.0150163,8.0162325 +10X_cells.GCAGTTAAGTTAGGTA-L8TX_180406_01_H02,0.14722858,7.600688 +10X_cells.ACTATCTAGGGCTCTC-L8TX_180406_01_C08,1.537134,7.1200123 +10X_cells.CGTCAGGGTCTAGTCA-L8TX_180406_01_G02,1.1728586,7.2867694 +10X_cells.GGACGTCAGACAGACC-L8TX_180406_01_E02,1.1459408,7.412003 +10X_cells.ACATGGTCAGGACCCT-L8TX_180406_01_E06,1.272169,7.4684772 +10X_cells.TGGCGCACATGCCCGA-L8TX_180406_01_E02,-0.952678,7.7765923 +10X_cells.CGAGAAGTCACTGGGC-L8TX_180406_01_B06,-0.23355515,7.9455767 +10X_cells.GATCAGTAGTTCCACA-L8TX_180406_01_H01,0.5803301,6.770511 +10X_cells.CCTCTGATCACGAAGG-L8TX_180406_01_C07,0.37435603,7.3935757 +10X_cells.CACAGGCAGTAGTGCG-L8TX_180406_01_C08,1.6686766,7.025097 +10X_cells.CTTTGCGGTGGCGAAT-L8TX_180406_01_E06,1.4638344,7.367056 +10X_cells.ATTACTCCATCGTCGG-L8TX_180406_01_B06,1.5015846,7.093488 +10X_cells.GCAGTTAAGGATTCGG-L8TX_180406_01_G02,2.0945144,6.6450577 +10X_cells.GATCTAGGTTAAAGAC-L8TX_180406_01_E07,1.6719586,7.057364 +10X_cells.CTTAACTGTCGCGTGT-L8TX_180406_01_E06,1.4755166,7.0683804 +10X_cells.GATCAGTCAGGGTTAG-L8TX_180406_01_C07,0.8456777,8.262957 +10X_cells.CCCTCCTGTCTGATCA-L8TX_180406_01_H02,-0.7217809,7.5518813 +10X_cells.CAGAGAGAGGCAATTA-L8TX_180406_01_H01,-1.1926945,7.165 +10X_cells.CACATTTGTGCAGACA-L8TX_180406_01_E07,0.06714444,7.641491 +10X_cells.GAATAAGGTGTTTGGT-L8TX_180406_01_C07,-0.6244817,8.576833 +10X_cells.TTGCGTCTCCATTCTA-L8TX_180406_01_C07,0.33186775,7.765389 +10X_cells.TCGAGGCGTTAGATGA-L8TX_180406_01_E07,0.1235041,7.471608 +10X_cells.GATCGCGAGTAAGTAC-L8TX_180406_01_B06,1.8574227,6.8284826 +10X_cells.CGCGGTACAGCGAACA-L8TX_180406_01_C07,1.0649174,7.300353 +10X_cells.CTCACACGTACCGCTG-L8TX_180406_01_E06,0.05970154,8.203278 +10X_cells.GTAGGCCCACAACGTT-L8TX_180406_01_E02,1.0527259,7.061931 +10X_cells.GAATAAGGTGACTACT-L8TX_180406_01_H02,1.2240027,6.979956 +10X_cells.ACCAGTAAGGGTCGAT-L8TX_180406_01_B06,0.055306174,7.5789213 +10X_cells.GGAAAGCCACGCTTTC-L8TX_180406_01_H01,-0.63684094,8.285282 +10X_cells.ACTTTCATCACGCGGT-L8TX_180406_01_C07,1.1246163,7.5636573 +10X_cells.CAGCAGCGTATTACCG-L8TX_180406_01_B06,1.2952325,7.392415 +10X_cells.CTCGGAGTCTCGAGTA-L8TX_180406_01_B06,0.07662045,7.092734 +10X_cells.GCCTCTATCCACGTTC-L8TX_180406_01_C07,1.2555844,7.6873646 +Smartseq_cells.SM-GE91G_S283_E1-50,-5.767872,7.726196 +Smartseq_cells.SM-GE91L_S155_E1-50,0.09253241,12.392438 +Smartseq_cells.SM-GE91C_S186_E1-50,-2.8674507,12.760227 +Smartseq_cells.SM-GE91C_S281_E1-50,-3.3474402,7.191216 +Smartseq_cells.SM-GE91H_S255_E1-50,-6.345629,9.665623 +Smartseq_cells.SM-GE91J_S168_E1-50,-1.7357061,13.742931 +10X_cells.GACGGCTAGTACGACG-L8TX_180406_01_C01,-1.5065325,9.100598 +10X_cells.CTCGTACTCCTTTACA-L8TX_180406_01_G01,1.1968566,7.7639856 +10X_cells.ACCCACTAGTACATGA-L8TX_180406_01_B02,1.6161666,7.703701 +10X_cells.ATGAGGGAGGACAGCT-L8TX_180406_01_B02,-0.68223923,9.13606 +10X_cells.CTAAGACGTTCCATGA-L8TX_180221_01_D10,0.656035,6.797309 +10X_cells.GCTGCAGTCTTGACGA-L8TX_180221_01_F10,0.17191039,7.433875 +10X_cells.GGCTGGTTCAGATAAG-L8TX_180221_01_G10,0.52312744,7.873541 +10X_cells.CTCACACTCATTGCGA-L8TX_180221_01_A11,0.26901013,6.8706737 +10X_cells.TGAGCATTCCACGACG-L8TX_180221_01_A11,1.0669636,7.00772 +10X_cells.TCAGGTACATACCATG-L8TX_190312_01_B02,1.65919,7.118403 +10X_cells.ACGAGCCGTTCAGTAC-L8TX_180926_01_E01,1.0987588,8.358849 +10X_cells.AGTAGTCTCAATACCG-L8TX_180712_01_H05,0.97984165,6.7609787 +10X_cells.AACTCCCAGAACTCGG-L8TX_180712_01_E05,1.0037692,6.9802127 +10X_cells.TTCGGTCCAAGAGGCT-L8TX_180712_01_F05,1.5568045,6.8925023 +10X_cells.TTTCCTCAGCGTAATA-L8TX_180712_01_H05,-2.181404,9.591276 +10X_cells.ACGATACTCCTTGCCA-L8TX_180712_01_A06,0.22348663,6.193532 +10X_cells.GCTTGAAAGCACAGGT-L8TX_180712_01_A06,-0.44568664,7.355291 +10X_cells.ATCACGAGTAAGAGAG-L8TX_180221_01_A12,-0.061216585,6.6771045 +10X_cells.CCAGCGAGTTACTGAC-L8TX_180221_01_A12,-0.2310198,6.6030536 +10X_cells.GGGTTGCTCCGGGTGT-L8TX_180221_01_B12,1.09468,7.607433 +10X_cells.CACACAACAATCTGCA-L8TX_180221_01_C12,1.722571,6.99636 +10X_cells.AACTGGTGTGCAGTAG-L8TX_180221_01_H11,0.052717727,6.709473 +10X_cells.CTCATTAGTCTCATCC-L8TX_180221_01_H11,-0.6062951,6.8777094 +10X_cells.CTGAAGTGTTGAGTTC-L8TX_180221_01_H11,0.9770335,6.846714 +Smartseq_cells.SM-GE679_S257_E1-50,-4.546336,6.977344 +10X_cells.CGTTCTGGTTCATGGT-L8TX_200625_02_F11,4.813447,18.049908 +10X_cells.GTAACTGTCCAAGTAC-L8TX_200625_02_F11,5.1780696,17.867395 +10X_cells.ACGGCCATCAGTCAGT-L8TX_200625_02_G11,5.680801,16.617622 +10X_cells.ATTGGTGAGACTAAGT-L8TX_200625_02_E11,5.075857,17.889183 +10X_cells.CATATTCGTGACTCAT-L8TX_200625_02_E11,4.746492,18.354095 +10X_cells.CCAGCGAGTTTGTGTG-L8TX_200625_02_E11,4.957704,17.951101 +Smartseq_cells.SM-GE65S_S086_E1-50,4.8698726,18.052687 +Smartseq_cells.SM-GE8ZR_S083_E1-50,5.031401,17.898844 +Smartseq_cells.SM-GE8ZR_S255_E1-50,4.996619,18.089417 +Smartseq_cells.SM-GE8ZR_S263_E1-50,5.181991,18.181957 +10X_cells.CCTACACGTGGAAAGA-L8TX_180406_01_G01,-0.6990756,8.341076 +10X_cells.GACTGCGGTAGGGACT-L8TX_180221_01_F09,7.100193,18.325846 +10X_cells.GAACATCTCCTATGTT-L8TX_180221_01_G09,6.5534716,17.440056 +10X_cells.TGCACCTTCTACCTGC-L8TX_180221_01_B10,8.046789,16.08847 +10X_cells.CAAGATCCAAGTCATC-L8TX_180406_01_F02,5.9641094,18.908382 +Smartseq_cells.SM-GE67T_S258_E1-50,5.8007555,18.705753 +Smartseq_cells.SM-GE67T_S268_E1-50,6.0612683,17.990501 +10X_cells.ATTTCTGAGTGAACAT-L8TX_180221_01_D09,7.4366274,15.995665 +10X_cells.TGGACGCCACAGTCGC-L8TX_180221_01_D09,6.6477747,16.077847 +10X_cells.GTAGGCCAGCGTGTCC-L8TX_180712_01_G05,7.2428417,17.862047 +10X_cells.CAGCATACACGGCTAC-L8TX_180221_01_H12,7.886557,16.998436 +10X_cells.AAATGCCTCTGAAAGA-L8TX_180221_01_E09,5.291094,18.531515 +10X_cells.GCGACCATCAGTGTTG-L8TX_180221_01_E09,6.47017,16.589283 +10X_cells.TAGCCGGAGGCCCTCA-L8TX_180221_01_E09,5.9433727,18.741936 +10X_cells.ACGATGTGTTAAGTAG-L8TX_180221_01_C09,6.6680536,16.043848 +10X_cells.GAACGGATCAACCATG-L8TX_180221_01_C09,7.2441373,15.608911 +10X_cells.CACACCTTCGAGCCCA-L8TX_180221_01_D09,5.984124,18.291323 +10X_cells.CCGTACTAGCTGTTCA-L8TX_180221_01_D09,6.289209,16.907946 +10X_cells.TATCTCAAGTGGCACA-L8TX_180221_01_D09,6.2788258,16.939257 +10X_cells.TGAGCATGTATAGGGC-L8TX_180221_01_D09,6.166176,16.681515 +10X_cells.AAGGCAGTCGCGCCAA-L8TX_180712_01_G05,7.614532,16.854548 +10X_cells.ACGAGCCTCCTTCAAT-L8TX_180712_01_G05,6.7041907,17.98668 +10X_cells.GGCCGATAGAAGCCCA-L8TX_180712_01_G05,7.492441,16.507372 +10X_cells.ACGCCAGAGGAATGGA-L8TX_180712_01_B06,7.721784,15.995164 +10X_cells.CTCAGAAAGGACATTA-L8TX_180712_01_B06,7.796904,17.186283 +10X_cells.TCGTAGACATGCCTTC-L8TX_180712_01_B06,8.095754,17.374672 +10X_cells.AGCTCTCGTAAGCACG-L8TX_180712_01_C06,7.3902144,17.177586 +10X_cells.ATAGACCCAATCAGAA-L8TX_180712_01_C06,7.667104,15.561354 +10X_cells.GAATGAAAGAGGTACC-L8TX_180712_01_C06,6.012518,18.529175 +Smartseq_cells.SM-GE67M_S281_E1-50,6.269804,18.666626 +Smartseq_cells.LS-15308_S34_E1-50,5.7861657,18.914398 +Smartseq_cells.LS-15309_S71_E1-50,5.8608165,18.933079 +Smartseq_cells.LS-15326_S86_E1-50,5.8321238,18.780136 +Smartseq_cells.LS-15327_S51_E1-50,5.776557,18.969051 +Smartseq_cells.LS-15338_S19_E1-50,5.9580216,19.115702 +Smartseq_cells.LS-15368_S68_E1-50,5.855977,18.572208 +Smartseq_cells.SM-D9D13_S46_E1-50,5.956797,18.962173 +Smartseq_cells.SM-D9D9E_S20_E1-50,5.887048,18.818155 +10X_cells.TCGTAGAGTGCACGAA-L8TX_181012_01_E05,7.4777684,15.525477 +10X_cells.GGATGTTCATTAGCCA-L8TX_180829_01_D09,6.4484687,18.669123 +10X_cells.ACGCCGATCAACACGT-L8TX_180907_01_G10,6.735228,17.534342 +10X_cells.CGTTGGGTCAGTGCAT-L8TX_180907_01_G10,7.9408975,16.568457 +10X_cells.CAGCGACTCAATACCG-L8TX_180406_01_H02,7.0151315,17.76391 +10X_cells.CCCAATCAGAACAACT-L8TX_180406_01_C07,7.621332,17.103247 +10X_cells.TTAGTTCTCTCGTTTA-L8TX_180406_01_C08,7.534565,15.240806 +10X_cells.TTGAACGCACGTTGGC-L8TX_180406_01_B06,7.5197625,16.332222 +10X_cells.GGACATTGTGTTAAGA-L8TX_180406_01_E06,7.556752,15.335473 +10X_cells.TCTGAGAGTCGGCATC-L8TX_180406_01_G02,7.5446844,15.508835 +10X_cells.AAACGGGGTCATATGC-L8TX_180406_01_H01,8.04132,16.18785 +10X_cells.CTGTTTACACATTCGA-L8TX_180406_01_H01,8.520656,16.414852 +10X_cells.TACCTTATCCGCATAA-L8TX_180406_01_H01,7.641257,17.490372 +10X_cells.GCTGGGTAGCAGGCTA-L8TX_180406_01_G02,8.280003,17.093334 +10X_cells.CCGTTCACATTCACTT-L8TX_180406_01_H02,6.3843403,18.971811 +10X_cells.GATGAAAAGGAACTGC-L8TX_180406_01_H02,8.139685,16.975273 +10X_cells.GGAGCAAAGGCTATCT-L8TX_180406_01_B06,7.7545676,15.87028 +10X_cells.CCGTACTTCGCCAAAT-L8TX_180406_01_E06,7.803354,16.987087 +10X_cells.CACCAGGGTCCTCTTG-L8TX_180406_01_C08,7.421029,17.76607 +10X_cells.ACATACGAGGCTAGGT-L8TX_180406_01_C07,7.904709,15.708736 +10X_cells.GGGAGATAGACTAGGC-L8TX_180406_01_C07,7.5389023,15.114337 +10X_cells.CAGCAGCAGAACTCGG-L8TX_180406_01_E07,7.6633315,15.646246 +Smartseq_cells.SM-GE914_S194_E1-50,5.861546,18.127232 +Smartseq_cells.SM-GE915_S002_E1-50,5.7288337,18.334478 +Smartseq_cells.SM-GE91L_S070_E1-50,6.3689623,17.95411 +Smartseq_cells.SM-GE91L_S163_E1-50,6.3922043,18.073296 +Smartseq_cells.SM-GE91L_S174_E1-50,6.737155,17.52642 +10X_cells.GGGTCTGTCCAGAGGA-L8TX_180221_01_E12,7.4661465,16.199818 +10X_cells.AATCCAGAGCTAGTTC-L8TX_200625_02_G11,6.0753355,15.622776 +10X_cells.CATGGCGAGCCGATTT-L8TX_200625_02_G11,6.057489,15.633325 +10X_cells.GCTGCTTAGTGTTGAA-L8TX_200625_02_G11,5.955926,15.856447 +10X_cells.AGCGTATCACTGTGTA-L8TX_200625_02_E11,6.0741596,17.554548 +10X_cells.ATGTGTGAGCGCCTTG-L8TX_171026_01_B04,7.5390406,17.722555 +10X_cells.CGACCTTGTGCAGACA-L8TX_171026_01_B05,5.0980606,19.000984 +10X_cells.CACAGTAAGAATTGTG-L8TX_171026_01_A05,6.4671626,18.409143 +10X_cells.TTGGAACAGTGGAGTC-L8TX_171026_01_A04,6.5268817,18.55379 +10X_cells.CGAGCACAGTTCGCAT-L8TX_171026_01_C05,5.3903737,19.272894 +10X_cells.TTAGGACGTACAGTGG-L8TX_171026_01_B04,6.935656,18.004313 +10X_cells.AGCGTCGGTTCGCGAC-L8TX_171026_01_D05,7.82523,16.406248 +10X_cells.AGCTCCTAGATGCGAC-L8TX_171026_01_E05,7.438934,17.454254 +10X_cells.TCGGGACTCCGCTGTT-L8TX_171026_01_G03,7.3321166,17.71785 +10X_cells.CCATTCGGTCTTGTCC-L8TX_171026_01_B04,6.8795004,18.850372 +10X_cells.ACATCAGCATTTGCCC-L8TX_171026_01_F04,6.057309,18.124886 +10X_cells.CTGATAGTCCATTCTA-L8TX_171026_01_F04,6.4509096,17.63075 +10X_cells.GCTCTGTTCACCTCGT-L8TX_171026_01_F04,7.3432093,16.980318 +10X_cells.TGTGTTTTCAACACAC-L8TX_171026_01_G04,5.333329,19.275482 +10X_cells.CGGACGTCACTTAAGC-L8TX_171026_01_A05,8.412361,17.064095 +10X_cells.TCGCGTTTCGCGATCG-L8TX_171026_01_A05,5.8837132,19.411253 +10X_cells.TGGGCGTAGGCATTGG-L8TX_171026_01_H03,7.80372,17.097704 +10X_cells.ATCACGACACTATCTT-L8TX_171026_01_A04,6.4645724,19.168552 +10X_cells.GATCGTATCCCTAATT-L8TX_171026_01_A04,6.977654,18.416948 +10X_cells.GTTAAGCTCCCTAATT-L8TX_171026_01_A04,7.314743,18.262793 +10X_cells.TCGGGACCATCGGAAG-L8TX_171026_01_A04,5.39933,19.306694 +10X_cells.TGACAACTCAATACCG-L8TX_171026_01_C05,5.956186,17.66929 +10X_cells.ACACCAAAGAGGTACC-L8TX_171026_01_E05,7.5384007,17.421486 +10X_cells.ACACCCTCAGATTGCT-L8TX_171026_01_F05,7.178182,18.37026 +10X_cells.GTCATTTTCCTTTACA-L8TX_171026_01_F05,7.208687,17.819777 +10X_cells.CGTCACTTCAGCGATT-L8TX_171026_01_G05,6.6504755,18.675243 +10X_cells.TAGTGGTGTCTTCTCG-L8TX_171026_01_G05,6.8993163,18.331482 +10X_cells.TAGCCGGAGGACAGCT-L8TX_171026_01_H05,7.3739395,17.148396 +Smartseq_cells.SM-DD44N_S44_E1-50,6.2174907,18.960302 +Smartseq_cells.SM-GE91J_S237_E1-50,6.041226,17.897242 +10X_cells.TTCTCCTGTCGCATCG-L8TX_180406_01_B02,7.7980223,17.180527 +10X_cells.ATGGGAGTCAACTCTT-L8TX_180406_01_C01,7.6945324,17.296595 +10X_cells.CCAGCGAGTCGCATCG-L8TX_180406_01_B02,6.5060573,18.213247 +10X_cells.CGAGCCATCCGAACGC-L8TX_180406_01_D01,7.1675625,17.693792 +10X_cells.CTAGAGTTCGGAAATA-L8TX_180406_01_E01,7.533456,15.190133 +10X_cells.GGACATTCATACTCTT-L8TX_180406_01_E01,8.06051,17.660952 +10X_cells.AGTCTTTAGCTCCTCT-L8TX_180406_01_F01,6.6468496,17.347406 +10X_cells.ATCATCTCAATCCAAC-L8TX_180406_01_D02,8.187465,15.551196 +10X_cells.GTAGTCAGTCACCTAA-L8TX_180221_01_G10,7.0895295,18.111668 +10X_cells.AGCCTAAGTCCGTGAC-L8TX_180221_01_D10,7.4724393,17.995283 +10X_cells.TACTTGTTCTGTTGAG-L8TX_180221_01_D10,8.561211,17.05626 +10X_cells.ACAGCTAAGGCCATAG-L8TX_180221_01_E10,7.7297225,17.95511 +10X_cells.ATCGAGTTCAGTGCAT-L8TX_180221_01_E10,7.169854,18.259415 +10X_cells.CGTAGCGGTATTCTCT-L8TX_180221_01_E10,8.284923,15.893496 +10X_cells.CTTCTCTCACGAGAGT-L8TX_180221_01_F10,8.31507,17.315138 +10X_cells.GCGAGAACAATTGCTG-L8TX_180221_01_F10,8.036453,15.390508 +10X_cells.TGGTTCCTCATAACCG-L8TX_180221_01_F10,7.9917,16.989172 +10X_cells.CTTTGCGGTGTAAGTA-L8TX_180221_01_A11,6.824035,17.165138 +10X_cells.CTGTGCTAGTTTGCGT-L8TX_190312_01_B02,6.122503,18.354733 +10X_cells.GCGCAGTTCATATCGG-L8TX_190312_01_C02,6.697042,17.903215 +10X_cells.AGACGTTTCCCAGGTG-L8TX_190312_01_D02,6.885423,15.844536 +10X_cells.CTAGCCTGTCAGAATA-L8TX_190312_01_D02,6.4069133,17.933098 +10X_cells.TTAGGCAAGCGTGAAC-L8TX_190312_01_G02,6.4675975,16.65608 +10X_cells.CGCGTTTTCGGTGTTA-L8TX_180926_01_C12,6.3331485,18.176289 +10X_cells.ATTATCCGTAGCGTCC-L8TX_181012_01_B05,7.493671,17.26313 +10X_cells.ATTGGACAGATACACA-L8TX_180221_01_C11,6.5030212,16.277325 +10X_cells.TGTTCCGAGCCTTGAT-L8TX_180221_01_F11,7.2853785,15.975594 +Smartseq_cells.SM-GE67Q_S238_E1-50,6.148153,18.384277 +10X_cells.CGGAGCTAGTCAATAG-L8TX_180907_01_H11,7.0290647,17.894548 +10X_cells.GGAATAACACGAAACG-L8TX_180907_01_B12,7.9673276,15.456967 +10X_cells.CAGATCACAGCCTGTG-L8TX_180926_01_E01,7.420812,17.501183 +10X_cells.CTTCTCTTCACGATGT-L8TX_181011_01_B03,6.84097,18.410498 +10X_cells.TAAGTGCGTTCCACTC-L8TX_181011_01_H03,6.6241407,18.722616 +Smartseq_cells.SM-GE91B_S081_E1-50,5.6078053,18.539091 +10X_cells.TCGCGTTAGGATATAC-L8TX_180221_01_D12,7.6724124,16.262646 +10X_cells.ATCCACCAGTAATCCC-L8TX_180504_01_E01,7.2351766,15.455033 +10X_cells.CCGTTCATCTCAAACG-L8TX_200611_02_A05,8.399949,17.251888 +10X_cells.CGTTCTGAGTGGGATC-L8TX_200611_02_A05,6.85736,18.119835 +10X_cells.CACAGTACACGGCTAC-L8TX_180712_01_A06,7.98243,17.682951 +10X_cells.GATCAGTAGCTAGTCT-L8TX_180712_01_H05,6.2784467,18.804914 +10X_cells.CACAGGCCATGTTGAC-L8TX_180712_01_F05,8.2529335,17.343786 +10X_cells.CTACACCTCATCTGCC-L8TX_180712_01_F05,8.040539,16.371931 +10X_cells.CTCGAGGTCTGATACG-L8TX_180712_01_F05,7.004936,16.387827 +10X_cells.GTGGGTCAGTACCGGA-L8TX_180712_01_F05,6.9547706,17.603033 +10X_cells.GATGAAAGTCAATACC-L8TX_180712_01_H05,7.387684,17.935814 +10X_cells.AGGCCACGTGATGATA-L8TX_180712_01_A06,7.9675264,17.041687 +10X_cells.ATAAGAGCATGAACCT-L8TX_180712_01_A06,6.9194484,17.971302 +10X_cells.GGACAGATCTCCGGTT-L8TX_180712_01_A06,6.174246,18.39276 +10X_cells.CGATGTATCCCTGACT-L8TX_180504_01_E01,8.043265,16.228558 +10X_cells.TCCCGATGTGACTCAT-L8TX_180504_01_E01,8.243306,16.650537 +10X_cells.CGAATGTTCATCGATG-L8TX_180221_01_A12,5.93143,16.064156 +10X_cells.TGGTTCCAGCTGAAAT-L8TX_180221_01_A12,6.078697,16.012917 +10X_cells.AAGCCGCTCTAACTTC-L8TX_180221_01_B12,7.6540694,15.2708845 +10X_cells.CTACCCACAAGGTTTC-L8TX_180221_01_B12,8.095189,16.28529 +10X_cells.GACCTGGGTACATGTC-L8TX_180221_01_B12,7.801434,15.474425 +10X_cells.TGACGGCAGTGAACAT-L8TX_180221_01_B12,7.106169,15.492605 +10X_cells.ATCATGGGTGAGTGAC-L8TX_180221_01_C12,6.9837346,16.045376 +10X_cells.AGCTCTCTCAAGAAGT-L8TX_180221_01_D12,8.234592,15.776358 +10X_cells.GCAGTTATCTGATTCT-L8TX_180221_01_D12,8.536248,16.643772 +10X_cells.GGGCATCGTTTAAGCC-L8TX_200611_02_A05,6.9389687,17.605007 +10X_cells.TACTTGTAGGTGATAT-L8TX_200611_02_A05,7.790322,17.713923 +Smartseq_cells.SM-GE91L_S193_E1-50,6.4824567,18.097956 +10X_cells.AAAGTAGCAGTTCATG-L8TX_180115_01_D09,6.652301,17.603453 +10X_cells.CTAGTGAAGCCGTCGT-L8TX_180115_01_G11,7.241389,17.723953 +10X_cells.CAGAGAGTCAACTCTT-L8TX_180115_01_G11,7.3277073,18.03696 +10X_cells.ATTGGTGTCAGTGCAT-L8TX_180115_01_A09,6.2694306,16.473795 +10X_cells.GCATACAAGAAACGAG-L8TX_180115_01_A11,6.669679,16.383091 +10X_cells.ATCCGAACAAAGTCAA-L8TX_180115_01_E09,6.6688685,16.972258 +10X_cells.CCACGGACATGGGAAC-L8TX_180115_01_A09,6.0641947,17.55832 +10X_cells.TTAGGACGTGGCGAAT-L8TX_180115_01_A09,6.7776794,16.184044 +10X_cells.CAGAGAGGTACGAAAT-L8TX_180115_01_C09,6.028225,16.593075 +10X_cells.TGCCAAAGTCAACTGT-L8TX_180115_01_C09,6.2714195,16.596846 +10X_cells.GTATCTTAGCCTTGAT-L8TX_180115_01_D09,6.230203,16.553364 +10X_cells.GTCACAAGTCCAGTTA-L8TX_180115_01_A11,7.0268664,17.52341 +10X_cells.TTCTCAATCTGGTATG-L8TX_180115_01_A11,7.5567493,17.576077 +10X_cells.CTAGCCTAGGGATACC-L8TX_180115_01_H10,6.0687833,17.746609 +10X_cells.GGCTGGTGTCAAAGAT-L8TX_180115_01_H10,7.622671,15.80828 +10X_cells.CGTCTACAGAGCTGGT-L8TX_180115_01_B11,6.887229,15.72027 +10X_cells.CCACGGAGTCCGAATT-L8TX_180115_01_C11,7.8624673,16.34277 +10X_cells.CTGAAACGTCGAAAGC-L8TX_180115_01_C11,7.6294694,15.454646 +10X_cells.CATGGCGCAGATGGCA-L8TX_180115_01_F10,6.642336,16.987507 +10X_cells.CTAACTTCATCTCGCT-L8TX_180115_01_F10,7.772907,16.056492 +10X_cells.CGGACACTCGTTTATC-L8TX_180115_01_G11,6.435663,18.873915 +10X_cells.AGTGGGAGTAAGTGTA-L8TX_180115_01_H11,8.23149,15.813617 +10X_cells.ATCGAGTGTCACCCAG-L8TX_180115_01_H11,6.44391,18.724342 +10X_cells.AGTGAGGGTAAATGTG-L8TX_180115_01_F09,6.3535,16.093866 +10X_cells.TGATTTCGTTCGAATC-L8TX_180115_01_G08,7.0641828,18.439226 +10X_cells.GCCTCTAGTATGAATG-L8TX_180115_01_H08,7.999129,17.681452 +10X_cells.GCTGCAGTCCTCAACC-L8TX_171120_01_F07,7.911772,16.529316 +10X_cells.GGACAGACACCATGTA-L8TX_171120_01_F07,6.403986,17.04286 +10X_cells.GACCTGGCACTGCCAG-L8TX_180115_01_E08,6.224677,19.404236 +10X_cells.TTTACTGCAGGTGGAT-L8TX_180115_01_E08,6.909204,18.883427 +Smartseq_cells.LS-15085_S42_E1-50,6.217381,18.540398 +Smartseq_cells.LS-15096_S73_E1-50,6.140382,18.92286 +Smartseq_cells.LS-15552_S27_E1-50,6.1040382,18.855713 +Smartseq_cells.SM-D9E5W_S54_E1-50,5.9535246,18.569845 +Smartseq_cells.SM-D9E5X_S57_E1-50,6.0708637,18.39097 +10X_cells.ACATACGTCTCAACTT-L8TX_180221_01_E09,12.969954,15.526943 +10X_cells.GTCTTCGCATATACGC-L8TX_180221_01_E09,13.07107,15.573541 +10X_cells.AACTTTCCAGTCCTTC-L8TX_180221_01_C09,13.245058,15.081624 +Smartseq_cells.LS-15084_S51_E1-50,16.146948,14.42237 +10X_cells.CCATGTCGTAGCGTAG-L8TX_180406_01_G02,13.342043,15.686979 +10X_cells.TTGAACGTCGCTTGTC-L8TX_200625_02_F11,13.909376,15.174665 +10X_cells.AGAGCTTTCTAACTGG-L8TX_171026_01_H05,12.578231,15.456213 +10X_cells.ATGAGGGGTGTTAAGA-L8TX_180221_01_D10,13.651842,15.454756 +10X_cells.CCGGGATTCGATGAGG-L8TX_180221_01_G10,13.433586,15.701195 +10X_cells.CCCAATCTCTGCTGCT-L8TX_180221_01_A11,13.866885,15.483445 +10X_cells.TCGGGACAGTGTACTC-L8TX_200611_02_A05,13.796929,15.353524 +10X_cells.GTGTGCGCATTGCGGC-L8TX_180221_01_G09,15.595058,14.200505 +10X_cells.CGATCGGGTTTACTCT-L8TX_180221_01_F09,14.2547245,13.638385 +10X_cells.ATAACGCCAAAGCAAT-L8TX_180221_01_F09,13.801822,15.993548 +10X_cells.GGAGCAATCTTATCTG-L8TX_180221_01_F09,15.894849,15.055759 +10X_cells.AGCATACGTGGCTCCA-L8TX_180221_01_H09,12.645883,15.529754 +10X_cells.TCGGTAAGTCTGCAAT-L8TX_180221_01_H09,15.562912,15.279377 +10X_cells.TCTTTCCGTGTGCGTC-L8TX_180221_01_A10,16.332432,14.16803 +10X_cells.CCCAGTTTCGGAAACG-L8TX_180406_01_F02,14.360205,14.256941 +Smartseq_cells.SM-GE63J_S356_E1-50,16.468445,13.815999 +Smartseq_cells.SM-GE63L_S314_E1-50,14.021812,11.793252 +10X_cells.GGATTACTCTCAAGTG-L8TX_180712_01_B06,12.787627,15.722296 +10X_cells.TGCGTGGGTCGCGAAA-L8TX_180221_01_D09,13.598389,14.267545 +10X_cells.CCACCTAGTACGAAAT-L8TX_180221_01_D09,14.574873,14.6630745 +10X_cells.ATTGGTGCATCCGTGG-L8TX_180712_01_B06,13.862369,15.6691675 +10X_cells.GCGCCAAGTAGCGCAA-L8TX_180712_01_C06,14.688173,15.528647 +10X_cells.GTCTCGTTCATTCACT-L8TX_180712_01_C06,13.977294,15.762002 +10X_cells.GACGTGCAGACCACGA-L8TX_180221_01_H12,14.389424,13.903023 +10X_cells.AACTGGTCAAGCCATT-L8TX_180221_01_C09,13.5828285,14.124174 +10X_cells.TATCTCACAACGATCT-L8TX_180221_01_C09,14.443901,15.318149 +10X_cells.TCATTTGGTTCCACTC-L8TX_180221_01_C09,12.888987,14.391737 +10X_cells.CGTCTACGTAGCCTAT-L8TX_180607_01_C05,15.595767,14.711926 +10X_cells.CAACCAAAGTATGACA-L8TX_180712_01_G05,15.2974,14.533156 +10X_cells.CACCAGGCATCCTTGC-L8TX_180712_01_B06,12.4642,15.49031 +10X_cells.CTCATTACACGAAACG-L8TX_180712_01_B06,14.246599,15.412803 +Smartseq_cells.SM-GE67M_S349_E1-50,16.139803,13.378763 +Smartseq_cells.LS-15019_S37_E1-50,16.77065,14.036528 +Smartseq_cells.LS-15084_S66_E1-50,16.282936,14.060654 +Smartseq_cells.LS-15327_S37_E1-50,16.729593,13.398337 +Smartseq_cells.LS-15355_S46_E1-50,16.121597,13.44606 +Smartseq_cells.LS-15576_S94_E1-50,15.053007,13.109783 +Smartseq_cells.LS-15577_S81_E1-50,16.78518,13.63876 +Smartseq_cells.LS-15577_S95_E1-50,16.787235,13.542423 +Smartseq_cells.LS-15581_S34_E1-50,16.66167,13.329433 +Smartseq_cells.SM-D9CYP_S92_E1-50,15.900458,13.870552 +Smartseq_cells.SM-GE8ZK_S003_E1-50,16.661945,13.351857 +Smartseq_cells.SM-GE8ZK_S024_E1-50,16.244497,13.64968 +10X_cells.TCGCGTTTCTGTTTGT-L8TX_181012_01_G04,14.941499,15.4091425 +10X_cells.CACATTTGTGCTAGCC-L8TX_181011_01_C04,13.327446,13.985661 +10X_cells.CATATGGTCACCGTAA-L8TX_180907_01_G10,14.231537,16.017567 +10X_cells.CAAGAAATCCTACAGA-L8TX_180829_01_E10,16.679968,13.769989 +10X_cells.ATGAGGGCACACTGCG-L8TX_180829_01_D09,13.818667,14.423855 +10X_cells.CGTGTCTGTGTAATGA-L8TX_180829_01_D10,12.648367,15.141695 +10X_cells.TGCCCATTCTAGCACA-L8TX_180829_01_D10,14.699938,14.818455 +10X_cells.AGACGTTCAATACGCT-L8TX_180829_01_E10,15.109274,14.424969 +10X_cells.TTAACTCTCTTGCCGT-L8TX_181011_01_H02,15.611271,15.048903 +10X_cells.AGCCTAAGTCACAAGG-L8TX_181011_01_C04,15.0772505,14.396656 +10X_cells.CGTGTAAGTGGTCTCG-L8TX_181011_01_C04,13.458144,14.396313 +10X_cells.CACCAGGTCTACCTGC-L8TX_181012_01_G04,13.704908,15.423908 +10X_cells.GGCTCGACATAGGATA-L8TX_181012_01_G04,14.091028,15.388212 +10X_cells.TAGTTGGGTAGCTGCC-L8TX_181012_01_H04,13.466198,15.375711 +10X_cells.ATCATCTCAAGTCTGT-L8TX_181012_01_E05,14.160653,14.85373 +10X_cells.TCATTACTCCCGGATG-L8TX_180406_01_E07,13.616438,14.578098 +10X_cells.GCGCCAACAGCGTAAG-L8TX_180406_01_H01,14.590215,14.567647 +10X_cells.CTCGAGGGTCCATCCT-L8TX_180406_01_G02,14.1744995,14.452149 +10X_cells.GACAGAGGTTCCCTTG-L8TX_180406_01_H02,14.205102,13.580971 +10X_cells.ACGCAGCGTCTCGTTC-L8TX_180406_01_C07,13.611397,14.596604 +10X_cells.AGTGAGGTCGCGTTTC-L8TX_180406_01_C07,14.6484585,14.495817 +10X_cells.ATTGGTGTCAGTCAGT-L8TX_180406_01_E07,13.835853,14.331593 +10X_cells.TCGCGTTTCACGATGT-L8TX_180406_01_E07,12.700632,14.939333 +Smartseq_cells.SM-GE5VA_S265_E1-50,16.745005,13.432842 +10X_cells.GATGAAAGTCTGCCAG-L8TX_171026_01_B04,16.947216,13.871631 +10X_cells.CCGTTCAGTGGTACAG-L8TX_171026_01_E05,14.147482,12.426182 +10X_cells.CAACCTCGTTTGACAC-L8TX_171026_01_F03,13.671941,13.956648 +10X_cells.CATCAAGAGGCCGAAT-L8TX_171026_01_B04,14.924584,14.208313 +10X_cells.CGTTGGGTCCAGAAGG-L8TX_171026_01_B04,15.85161,14.010213 +10X_cells.CTCGGGAAGAAGGGTA-L8TX_171026_01_F04,14.342304,14.879496 +10X_cells.GTCAAGTCATAACCTG-L8TX_171026_01_F04,15.452105,14.668139 +10X_cells.TGTCCCACACGCATCG-L8TX_171026_01_F04,14.511096,14.669899 +10X_cells.CCTACACAGAAGGGTA-L8TX_171026_01_G04,16.191336,15.004967 +10X_cells.CTCGAAATCAAACAAG-L8TX_171026_01_G04,15.340182,14.200185 +10X_cells.GAATGAAAGTTAACGA-L8TX_171026_01_H04,15.912191,14.052629 +10X_cells.TGCTGCTGTGTTAAGA-L8TX_171026_01_H04,16.11649,14.269718 +10X_cells.CATGCCTTCAGCATGT-L8TX_171026_01_A05,15.794829,14.443618 +10X_cells.GACTACACAGTATCTG-L8TX_171026_01_A05,15.885772,14.819424 +10X_cells.CATCGAAAGTTATCGC-L8TX_171026_01_H03,13.6354,15.43525 +10X_cells.AGAGCGAAGCCTATGT-L8TX_171026_01_C05,14.764459,14.92581 +10X_cells.GAATGAATCTTGGGTA-L8TX_171026_01_C05,16.273962,13.161842 +10X_cells.AGTGTCAGTAAGGATT-L8TX_171026_01_D05,16.03537,14.34368 +10X_cells.CGTCTACAGAATGTTG-L8TX_171026_01_E05,14.167492,15.826004 +10X_cells.AACACGTAGTTAACGA-L8TX_171026_01_F05,14.846549,15.457668 +10X_cells.AGTAGTCTCTCGTTTA-L8TX_171026_01_F05,14.703112,15.027372 +10X_cells.TTGGCAACAGCTTAAC-L8TX_171026_01_F05,15.134399,15.295049 +10X_cells.CGATGTATCATAAAGG-L8TX_171026_01_G05,13.59838,15.244246 +10X_cells.CACCAGGCACTGTGTA-L8TX_171026_01_H05,14.033076,15.397442 +10X_cells.CTAGTGACACGTCTCT-L8TX_171026_01_H05,16.679558,13.38039 +10X_cells.GGGATGACATGCAACT-L8TX_171026_01_H05,12.633708,15.607025 +Smartseq_cells.SM-DD442_S33_E1-50,16.499805,13.804599 +Smartseq_cells.SM-DD44A_S17_E1-50,16.33739,13.825357 +Smartseq_cells.SM-GE92I_S302_E1-50,16.47424,13.368755 +10X_cells.CGGACGTTCTGCGGCA-L8TX_181206_01_H11,14.2333555,14.960217 +10X_cells.GAGGTGAGTTAAGATG-L8TX_181206_01_A12,14.018152,14.415695 +10X_cells.TTTACTGGTGGTAACG-L8TX_181206_01_A12,15.635935,14.225503 +10X_cells.TTAACTCCAAAGGCGT-L8TX_181206_01_B12,14.174098,14.99986 +10X_cells.CACCAGGTCTGAGTGT-L8TX_181206_01_E12,14.99461,14.636392 +10X_cells.CGAATGTTCCACTCCA-L8TX_180406_01_G01,14.716382,14.589711 +Smartseq_cells.SM-GE8Z7_S024_E1-50,15.980033,13.337512 +10X_cells.TAGACCAAGTAATCCC-L8TX_180221_01_F10,15.596575,15.183634 +10X_cells.GGACATTAGGTACTCT-L8TX_190312_01_D02,15.866277,13.887961 +10X_cells.GGGCACTAGTCAAGGC-L8TX_180221_01_A11,14.165534,14.560819 +10X_cells.ACTTTCACACCATGTA-L8TX_190312_01_G02,13.702926,14.3094635 +10X_cells.TAAACCGAGTCATGCT-L8TX_180221_01_E10,15.449992,15.013359 +10X_cells.TTAGTTCGTTATCACG-L8TX_180221_01_E10,16.126938,15.038728 +10X_cells.CGTAGCGCATCCGCGA-L8TX_180221_01_D10,15.809182,15.038864 +10X_cells.GAACCTACATGAAGTA-L8TX_180221_01_D10,14.425107,15.84392 +10X_cells.TTTGGTTCAAGTCTAC-L8TX_180221_01_D10,15.161552,15.047041 +10X_cells.GGATGTTAGGAGCGTT-L8TX_180221_01_E10,15.445241,14.916153 +10X_cells.CCCAGTTCAATCCGAT-L8TX_180221_01_F10,15.516194,14.483696 +10X_cells.TCCACACTCGTCCAGG-L8TX_180221_01_F10,14.702414,15.758722 +10X_cells.ACGCCAGAGTAGGCCA-L8TX_180221_01_G10,12.730724,15.780405 +10X_cells.TAGTGGTGTTAGTGGG-L8TX_180221_01_G10,13.986509,14.528887 +10X_cells.TCATTACCAGCCAATT-L8TX_180221_01_G10,16.818419,14.284878 +10X_cells.ATTGGTGAGCTCAACT-L8TX_180221_01_H10,15.312406,14.731987 +10X_cells.GAACCTATCAATACCG-L8TX_180221_01_A11,15.170748,15.465628 +10X_cells.TGAGCCGGTCCAACTA-L8TX_181012_01_B05,14.640173,15.507342 +10X_cells.CGGAGTCAGTTGAGTA-L8TX_180221_01_G11,15.119351,13.262289 +10X_cells.CATCCACGTAATTGGA-L8TX_190312_01_H02,16.04381,14.120293 +10X_cells.TTGCGTCCAATCAGAA-L8TX_190312_01_D01,15.681566,14.729145 +10X_cells.CTGAAGTAGCCACGCT-L8TX_190312_01_F01,15.414531,14.463094 +10X_cells.ACTTACTGTCCTCTTG-L8TX_180907_01_E11,15.686511,14.770307 +10X_cells.CACCACTTCGAACGGA-L8TX_180907_01_G11,15.1696615,14.508675 +10X_cells.CATCGGGTCAATAAGG-L8TX_180907_01_A12,12.998664,14.917226 +10X_cells.TGAGCCGTCTAGCACA-L8TX_180907_01_B12,14.624157,15.048699 +10X_cells.CAAGATCGTCGTCTTC-L8TX_180907_01_F11,15.468114,14.255812 +10X_cells.CCCATACTCTGCGACG-L8TX_180907_01_F11,13.177489,14.927669 +10X_cells.GTTACAGGTGACCAAG-L8TX_180907_01_F11,14.450726,15.504528 +10X_cells.TACTTACTCAATCACG-L8TX_190312_01_C01,17.024868,13.98132 +10X_cells.CTAGAGTGTCTGGTCG-L8TX_190312_01_F01,13.879789,14.441658 +10X_cells.CTCCTAGTCTTTACAC-L8TX_190312_01_F01,13.049446,15.444197 +10X_cells.CGTAGCGGTAAACGCG-L8TX_190312_01_G01,16.758247,13.413808 +10X_cells.TTGGCAATCTAACTGG-L8TX_190312_01_A02,14.364861,15.320324 +Smartseq_cells.SM-DD444_S44_E1-50,16.741257,13.646277 +10X_cells.TCGGTAAGTCCAGTTA-L8TX_180926_01_B01,14.173008,15.365048 +10X_cells.CAGAATCGTTCACGGC-L8TX_180926_01_D01,13.029846,15.1696005 +10X_cells.CTAGCCTGTGGTCCGT-L8TX_180926_01_D01,13.061553,15.831653 +10X_cells.GTGAAGGCAAAGCAAT-L8TX_181011_01_C03,14.942673,14.991169 +10X_cells.TTGGAACGTTTGCATG-L8TX_180712_01_E05,12.673937,14.592374 +10X_cells.AATCGGTAGTGTACCT-L8TX_180712_01_H05,14.290107,15.029685 +10X_cells.GTCTTCGGTCTCCACT-L8TX_180712_01_E05,14.5494795,15.849679 +10X_cells.CACCTTGGTAGCTTGT-L8TX_180221_01_B12,13.545281,14.881262 +10X_cells.CGTCAGGGTCGCATAT-L8TX_180712_01_H05,15.821292,13.337709 +10X_cells.CTCGAGGAGTGGTAGC-L8TX_180221_01_C12,13.690796,14.338714 +10X_cells.GTTCATTGTCTGGAGA-L8TX_180712_01_E05,12.986608,15.534774 +10X_cells.CACAGGCAGGCGTACA-L8TX_180712_01_F05,13.048379,15.029604 +10X_cells.CCGTTCACACAAGACG-L8TX_180712_01_F05,14.182371,14.933044 +10X_cells.TACTCATTCCGAGCCA-L8TX_180712_01_F05,14.688486,15.266812 +10X_cells.TGCGTGGCATCTATGG-L8TX_180504_01_E01,14.870064,15.104212 +10X_cells.GAATAAGCAAGTAGTA-L8TX_180221_01_A12,13.03867,14.108686 +10X_cells.GCCAAATTCTTGTTTG-L8TX_180221_01_A12,13.527158,14.201931 +10X_cells.GCGCGATCACACAGAG-L8TX_180221_01_A12,12.707213,14.275471 +10X_cells.GATGAGGTCGGCGCTA-L8TX_180221_01_B12,12.732518,14.927009 +10X_cells.AGCCTAACAGCCTTTC-L8TX_180221_01_C12,13.520228,15.066798 +10X_cells.CACATAGTCGGAGCAA-L8TX_200611_02_A05,15.516802,14.439938 +10X_cells.CGAGCACAGATCGATA-L8TX_200611_02_A05,14.892744,13.635588 +10X_cells.CGGAGTCCACTATCTT-L8TX_200611_02_A05,16.296053,14.100145 +Smartseq_cells.SM-GE91C_S294_E1-50,14.244182,12.658286 +10X_cells.GCGGGTTGTTTAGCTG-L8TX_180115_01_H09,13.524956,14.875972 +10X_cells.TACACGATCACGCGGT-L8TX_180115_01_E11,16.409931,14.19294 +10X_cells.GAACATCCACAACTGT-L8TX_180115_01_E10,15.0610695,14.475248 +10X_cells.TAAGCGTGTCTTGTCC-L8TX_180115_01_F09,13.464509,14.759987 +10X_cells.GCATACAGTAACGTTC-L8TX_180115_01_G11,16.733719,13.9409485 +10X_cells.ACTGATGTCGGTTAAC-L8TX_180115_01_B11,12.383962,14.892999 +10X_cells.CCGGTAGGTGTGTGCC-L8TX_180115_01_B09,14.5977,13.720786 +10X_cells.CACAAACCAGCTCGCA-L8TX_180115_01_A11,15.622302,14.088614 +10X_cells.CCGTACTTCGCGTTTC-L8TX_180115_01_A11,13.935518,14.579587 +10X_cells.CGAGAAGAGACTGGGT-L8TX_180115_01_H10,14.188528,14.113974 +10X_cells.CATCAAGCACGCATCG-L8TX_180115_01_F10,13.848403,14.345522 +10X_cells.GGGCACTTCCAGTATG-L8TX_180115_01_F10,12.798841,15.284126 +10X_cells.CATCGAATCGAATGCT-L8TX_180115_01_G10,12.9696665,14.920226 +10X_cells.CGAGCCAAGCCTATGT-L8TX_180115_01_G11,14.24224,15.810927 +10X_cells.CGGTTAATCTTTACGT-L8TX_180115_01_H09,12.963202,15.239442 +10X_cells.GAAGCAGCAGTTTACG-L8TX_180115_01_H09,13.719471,14.183724 +10X_cells.CGCTTCAAGAATCTCC-L8TX_180115_01_E09,15.498061,13.933991 +10X_cells.TGACTAGTCGGCGCTA-L8TX_171120_01_H07,15.357994,13.905783 +10X_cells.GCGACCACATTGTGCA-L8TX_171120_01_G07,15.495828,14.71973 +10X_cells.CACACCTTCAGGCGAA-L8TX_171120_01_G07,12.740018,15.6806345 +10X_cells.GCGCCAACACGAAACG-L8TX_171120_01_C07,14.294918,12.575853 +10X_cells.TGATTTCTCGAATCCA-L8TX_171120_01_D07,16.906305,13.536509 +10X_cells.AACACGTAGCATGGCA-L8TX_180115_01_E08,16.611477,13.6967125 +Smartseq_cells.LS-15008_S05_E1-50,16.541367,13.252416 +Smartseq_cells.LS-15300_S52_E1-50,16.53329,13.582212 +Smartseq_cells.LS-15353_S93_E1-50,16.738287,13.752415 +Smartseq_cells.LS-15507_S44_E2-50,16.839113,13.669745 +Smartseq_cells.LS-15507_S83_E2-50,16.20578,13.760592 +Smartseq_cells.LS-15507_S90_E2-50,16.757198,13.62787 +Smartseq_cells.LS-15507_S91_E2-50,14.882895,13.061542 +Smartseq_cells.LS-15589_S01_E1-50,16.661926,13.684561 +Smartseq_cells.SM-D9EQS_S24_E1-50,16.861946,13.500777 +10X_cells.CAGTCCTTCCACTGGG-L8TX_180712_01_B06,15.10003,14.95135 +10X_cells.GGTATTGAGTGTCCAT-L8TX_180221_01_D09,14.674515,14.425094 +Smartseq_cells.LS-15345_S49_E1-50,16.755096,14.064065 +Smartseq_cells.LS-15579_S87_E1-50,16.332146,14.002105 +10X_cells.ACGCCAGAGGCGATAC-L8TX_181011_01_H02,14.434673,15.557613 +10X_cells.CGGTTAATCAAAGTAG-L8TX_180406_01_B06,13.492395,15.059839 +10X_cells.GATCAGTTCACAAACC-L8TX_171026_01_F03,14.311344,15.679607 +10X_cells.CCACGGAAGACAGGCT-L8TX_171026_01_A04,16.615911,13.428652 +10X_cells.GGGTCTGAGGACAGCT-L8TX_181206_01_A12,14.592131,14.671352 +10X_cells.TGAGCATCAACGATGG-L8TX_181206_01_E12,13.8151655,15.523562 +10X_cells.CAACCAAAGCTAGCCC-L8TX_180221_01_G10,16.131172,15.040808 +10X_cells.AAGACCTTCCTGCAGG-L8TX_180926_01_E12,13.098324,15.8472595 +10X_cells.CACACTCTCTTAGCCC-L8TX_180926_01_E12,15.138857,15.486712 +10X_cells.AGGGAGTGTCGCGAAA-L8TX_180907_01_E11,13.11897,15.708933 +10X_cells.CTGAAGTGTCGATTGT-L8TX_190312_01_F01,16.383932,14.630714 +10X_cells.TCTGGAAAGCAATATG-L8TX_180926_01_E01,12.734821,15.553116 +10X_cells.ATCTGCCAGCAGCGTA-L8TX_180926_01_F01,13.26191,15.837288 +10X_cells.CAGAATCGTAAATGTG-L8TX_181011_01_A03,13.611151,15.163975 +10X_cells.CTGTTTATCATGTCTT-L8TX_180221_01_B12,13.175711,15.72182 +10X_cells.GATGAAAGTACAGCAG-L8TX_180115_01_F11,14.037577,15.508448 +10X_cells.GCTGGGTCAGACGCTC-L8TX_180115_01_F09,12.850616,14.676652 +10X_cells.CAACCAAGTTTACTCT-L8TX_180115_01_F08,14.598158,15.645349 +10X_cells.CACATAGAGCAACGGT-L8TX_180221_01_F09,14.1452055,-3.3132925 +10X_cells.CTCTGGTAGGGAACGG-L8TX_180221_01_F09,13.926228,-4.5152698 +10X_cells.ATTATCCTCTCCGGTT-L8TX_180221_01_B10,13.833548,-4.0067925 +10X_cells.GTGCAGCAGCTCCTTC-L8TX_180221_01_B10,15.018466,-2.9405284 +10X_cells.GTAGTCATCTTGTACT-L8TX_180221_01_C10,14.533458,-0.93183124 +10X_cells.TAGCCGGCAGACGCCT-L8TX_180221_01_C10,14.561834,-3.7967834 +10X_cells.AGTAGTCGTGGTCTCG-L8TX_180221_01_C09,14.614007,-0.8421952 +10X_cells.AGTAGTCTCTAACTGG-L8TX_180221_01_H12,13.875911,-2.895047 +10X_cells.CGAGCACGTTCCAACA-L8TX_180221_01_H12,14.919823,-3.351596 +10X_cells.TGCGTGGGTGTTGAGG-L8TX_180221_01_H12,14.285878,-3.0145974 +10X_cells.ACTTACTAGGCGATAC-L8TX_180221_01_E09,14.238682,-2.540743 +10X_cells.GCATACATCTGTCCGT-L8TX_180221_01_E09,14.296174,-2.7473078 +10X_cells.CAACCAATCTGTCTAT-L8TX_180221_01_C09,14.63342,-1.9299873 +10X_cells.CTTTGCGAGAGCTGCA-L8TX_180221_01_C09,14.228293,-2.7236147 +10X_cells.ATCTGCCTCGGCTTGG-L8TX_180607_01_C05,13.917567,-4.422695 +10X_cells.CTGATCCAGCAGCGTA-L8TX_180607_01_C05,13.4405775,-4.1969543 +10X_cells.GCATGCGGTAGCGTGA-L8TX_180607_01_C05,14.001963,-4.231373 +10X_cells.CAGGTGCGTACAGCAG-L8TX_180712_01_G05,14.074472,-4.322594 +10X_cells.TTCTACAGTGTCGCTG-L8TX_180712_01_B06,13.937186,-2.1376684 +Smartseq_cells.LS-15316_S88_E2-50,14.855997,-4.041847 +10X_cells.CAGCGACAGGCTACGA-L8TX_180829_01_D10,14.454309,-2.4478536 +10X_cells.CGTAGGCAGGATATAC-L8TX_180829_01_D10,13.58666,-4.5524416 +10X_cells.GCATACACAAATACAG-L8TX_180829_01_D10,14.363817,-1.843185 +10X_cells.GTCAAGTTCTAGCACA-L8TX_180829_01_D10,14.444239,-1.6076808 +10X_cells.TTAACTCGTGTGCCTG-L8TX_180829_01_D10,14.295411,-1.3143445 +10X_cells.TTGCGTCAGAACAACT-L8TX_180829_01_D10,13.99422,-1.7622215 +10X_cells.GACCTGGTCAGTTTGG-L8TX_180907_01_F10,15.4346,-1.2624496 +10X_cells.TACCTTACACAACGTT-L8TX_180907_01_F10,14.13009,-2.389273 +10X_cells.GCAGTTAGTAGCTGCC-L8TX_181011_01_G02,14.942975,-0.618474 +10X_cells.ACGGAGATCCGATATG-L8TX_181012_01_H04,12.478863,-4.180455 +10X_cells.GCACATAAGAAGCCCA-L8TX_181012_01_E05,13.676407,-3.0197215 +Smartseq_cells.SM-GE5VC_S215_E1-50,13.7658615,-4.5696387 +10X_cells.CACATAGGTGTGAAAT-L8TX_171026_01_G03,14.269976,-1.8230562 +10X_cells.CTAGTGACAGCTTAAC-L8TX_171026_01_B04,12.925871,-4.334257 +10X_cells.ATCATGGAGCGCTCCA-L8TX_171026_01_F03,12.256514,-4.761395 +10X_cells.ATCTGCCAGAGGTACC-L8TX_171026_01_F03,14.530394,-1.9070332 +10X_cells.CATCAAGTCCTTTCGG-L8TX_171026_01_F03,14.621361,-3.921476 +10X_cells.CATGCCTGTTTGACAC-L8TX_171026_01_F03,14.079773,-2.2895038 +10X_cells.GCGGGTTAGTCGAGTG-L8TX_171026_01_F03,13.353002,-4.1286707 +10X_cells.ATGAGGGCAATAAGCA-L8TX_171026_01_G03,14.555027,-2.8340547 +10X_cells.CGAGCCATCAACCATG-L8TX_171026_01_G03,12.175015,-4.8002877 +10X_cells.CATATGGTCCGCGTTT-L8TX_171026_01_F04,13.624131,-3.6390965 +10X_cells.GAATAAGAGTGGACGT-L8TX_171026_01_F04,14.43259,-2.316879 +10X_cells.GTGGGTCAGTAACCCT-L8TX_171026_01_F04,14.097137,-3.646388 +10X_cells.AGTGGGAAGCCACGCT-L8TX_171026_01_G04,15.654924,-3.197237 +10X_cells.CGATCGGCACATGGGA-L8TX_171026_01_G04,13.338822,-4.3384542 +10X_cells.GCGGGTTGTAGGAGTC-L8TX_171026_01_H04,14.943634,-2.6980202 +10X_cells.TAGCCGGAGGGTTTCT-L8TX_171026_01_H04,14.416262,-3.508301 +10X_cells.GTTAAGCCAAACAACA-L8TX_171026_01_A05,11.99444,-4.7398524 +10X_cells.CTCGAAAAGTACACCT-L8TX_171026_01_H03,14.909167,-2.708905 +10X_cells.GTCATTTGTAGGGTAC-L8TX_171026_01_H03,14.269944,-3.4734704 +10X_cells.GTGGGTCGTCTAAAGA-L8TX_171026_01_A04,13.362997,-4.3612084 +10X_cells.TCCCGATCACTTCGAA-L8TX_171026_01_A04,12.723003,-4.7865963 +10X_cells.CCACCTAAGAAACCTA-L8TX_171026_01_C05,14.471531,-3.2065723 +10X_cells.GAACATCGTCCATGAT-L8TX_171026_01_C05,15.008113,-2.2936175 +10X_cells.GTCAAGTTCACAATGC-L8TX_171026_01_C05,14.027658,-2.162336 +10X_cells.GCTTCCAGTGACGGTA-L8TX_171026_01_D05,14.431975,-3.598791 +10X_cells.TCCCGATTCAGCTGGC-L8TX_171026_01_E05,14.272591,-3.7658727 +10X_cells.ACGGGTCTCGGACAAG-L8TX_171026_01_F05,14.4625845,-4.0400033 +10X_cells.GTCGTAAAGCCAGTAG-L8TX_171026_01_F05,14.566084,-2.642679 +10X_cells.CCTACACAGTCCGTAT-L8TX_171026_01_G05,14.325852,-1.2123849 +Smartseq_cells.SM-GE92I_S138_E1-50,13.408099,-4.4744096 +10X_cells.ACGATGTAGCCAGAAC-L8TX_181206_01_H11,13.754167,-1.2734228 +10X_cells.CCACCTACACGGTAAG-L8TX_181206_01_H11,13.985716,-4.0285964 +10X_cells.CTCGTACCAATAGCAA-L8TX_181206_01_H11,14.493056,-2.9940007 +10X_cells.TAGTTGGAGAGCAATT-L8TX_181206_01_A12,13.252639,-3.8950047 +10X_cells.TCAGCAAGTCAAAGCG-L8TX_181206_01_B12,13.001879,-4.1340213 +10X_cells.CTAGTGACATATACCG-L8TX_181206_01_C12,14.611314,-2.5845633 +10X_cells.TGAGAGGGTAGTAGTA-L8TX_181206_01_C12,14.006722,-3.0021052 +10X_cells.ATGCGATAGATTACCC-L8TX_181206_01_F12,13.529971,-1.2979599 +Smartseq_cells.SM-GE67N_S273_E1-50,14.962564,-3.9749246 +10X_cells.CTCGGAGGTCTGATCA-L8TX_190312_01_G02,14.194219,-1.6192677 +10X_cells.AGATTGCCAGCGTAAG-L8TX_180221_01_D10,14.922548,-2.4722378 +10X_cells.CAGATCAAGTGACATA-L8TX_180221_01_E10,13.907417,-4.668885 +10X_cells.CATATGGAGGCTCTTA-L8TX_180221_01_E10,14.848246,-3.6340683 +10X_cells.TGGCTGGTCCAGGGCT-L8TX_180221_01_E10,12.238767,-4.547563 +10X_cells.CCATTCGCAGGCTCAC-L8TX_180221_01_F10,14.575494,-3.8489504 +10X_cells.CTCGTCATCCGCATCT-L8TX_190312_01_C02,14.020048,-4.169821 +10X_cells.TTGGCAATCGGTTAAC-L8TX_190312_01_C02,12.095397,-4.427525 +10X_cells.ACACCCTGTTGGAGGT-L8TX_180907_01_B11,14.570057,-4.154827 +10X_cells.ACGGGCTAGGCCCTCA-L8TX_180907_01_B11,14.163607,-1.3871317 +10X_cells.GGCTGGTGTCGGATCC-L8TX_180907_01_B11,14.611728,-2.0563884 +10X_cells.TTAGGACTCGACGGAA-L8TX_180221_01_C11,13.909334,-2.6507854 +10X_cells.CGGACACCAGGAATCG-L8TX_180221_01_F11,13.585951,-1.3179657 +10X_cells.CCACTACCAAGCTGTT-L8TX_190312_01_E02,11.964336,-4.430685 +10X_cells.CGTAGCGAGCTGTCTA-L8TX_180907_01_B12,13.4672165,-3.1117742 +10X_cells.TAAGTGCCAGCTCGAC-L8TX_180907_01_H11,12.907409,-4.3330164 +10X_cells.TAAGTGCTCAGCACAT-L8TX_180907_01_H11,13.763965,-3.3802278 +10X_cells.TGCCCTAGTGTCAATC-L8TX_180907_01_H11,14.272277,-4.3677373 +10X_cells.AAAGATGAGTCTTGCA-L8TX_180907_01_B12,14.586057,-3.310287 +10X_cells.GACCTGGTCGCGATCG-L8TX_190312_01_B01,14.341134,-3.0520413 +10X_cells.AGCGGTCCAGTCAGAG-L8TX_190312_01_H01,14.772099,-2.8455472 +10X_cells.TCGCGTTCACGAGGTA-L8TX_190312_01_H01,13.979274,-3.8010714 +10X_cells.AACTTTCTCAGCAACT-L8TX_180926_01_B01,14.808713,-3.1632516 +10X_cells.CTAAGACGTTGGTGGA-L8TX_181011_01_A03,13.710376,-3.631855 +10X_cells.GAACCTAGTCTAAAGA-L8TX_180712_01_H05,15.123259,-2.0032206 +10X_cells.CTCTAATGTCTTCTCG-L8TX_180115_01_A11,15.1466255,-3.4247754 +10X_cells.TTGACTTCACAGATTC-L8TX_180115_01_B10,14.6653385,-1.1139596 +10X_cells.TGGTTCCAGCTAACAA-L8TX_180115_01_E10,13.803267,-0.06172865 +10X_cells.AGCGTATAGCCACGCT-L8TX_180115_01_B09,13.603436,-1.8994489 +10X_cells.CATGCCTAGAGACTTA-L8TX_180115_01_B09,14.215217,-3.1666696 +10X_cells.GACTGCGAGCTCCTCT-L8TX_180115_01_B09,13.617882,-2.9839842 +10X_cells.GGTGAAGGTGACGCCT-L8TX_180115_01_B09,13.617285,-1.9489871 +10X_cells.TACGGGCGTCATCGGC-L8TX_180115_01_D09,13.902028,-1.4269011 +10X_cells.CCACTACTCTCGCTTG-L8TX_180115_01_A11,13.857909,-2.811987 +10X_cells.GGGCACTCATCCTTGC-L8TX_180115_01_A11,14.290304,-2.4612696 +10X_cells.CGGTTAAGTGAGGGAG-L8TX_180115_01_H10,13.796657,-0.8009048 +10X_cells.ACCCACTGTTCACGGC-L8TX_180115_01_B11,13.840269,-0.5125884 +10X_cells.GTGCAGCGTCGCTTTC-L8TX_180115_01_C11,13.889079,-1.0003506 +10X_cells.CTGTGCTGTTGGACCC-L8TX_180115_01_F10,14.344988,-1.6679899 +10X_cells.CAGCATAAGGCATTGG-L8TX_180115_01_G10,13.744394,-1.3214953 +10X_cells.TGTGGTACATTCACTT-L8TX_180115_01_G10,14.425404,-2.3107119 +10X_cells.TTAGGACCATGTCGAT-L8TX_180115_01_G10,13.695118,-1.4296287 +10X_cells.GTGTGCGCAAACCTAC-L8TX_180115_01_G11,14.259254,-3.0649424 +10X_cells.AGCTCCTTCGGAAATA-L8TX_180115_01_H09,14.350315,-1.9469742 +10X_cells.GCGGGTTAGTGCGTGA-L8TX_180115_01_E09,14.236204,-0.78016895 +10X_cells.ACGGGCTGTACGACCC-L8TX_180115_01_F09,14.523404,-2.6556883 +10X_cells.CGTGTCTTCAATAAGG-L8TX_171120_01_G07,14.117357,-3.9847536 +10X_cells.AAGGAGCAGAAGCCCA-L8TX_171120_01_H07,14.474242,-2.7925181 +10X_cells.ATTACTCGTCCAAGTT-L8TX_180115_01_D08,14.531804,-2.3347678 +10X_cells.AAAGATGCACCTCGGA-L8TX_171120_01_D07,13.186282,-4.3175673 +10X_cells.GTTCTCGGTAAGGGAA-L8TX_171120_01_E07,13.190825,-3.2178774 +10X_cells.AGGTCATGTGACAAAT-L8TX_171120_01_E07,14.355478,-2.4427717 +10X_cells.CAACTAGAGTGGTAAT-L8TX_171120_01_F07,14.423297,-1.5854706 +10X_cells.CGGAGCTCAGCCTTTC-L8TX_171120_01_F07,14.50654,-3.1436055 +10X_cells.GTCACGGAGTGCCATT-L8TX_171120_01_F07,14.580088,-3.488564 +10X_cells.CTACATTCATGACGGA-L8TX_180115_01_F08,12.2209015,-4.7834463 +10X_cells.GACGCGTCAAGCCGTC-L8TX_180115_01_F08,14.322089,-4.2502494 +Smartseq_cells.LS-15347_S93_E1-50,14.569541,-4.348471 +Smartseq_cells.SM-D9D7O_S75_E1-50,13.934582,-4.517782 +Smartseq_cells.SM-GE631_S183_E1-50,14.207193,-4.382788 +10X_cells.GCAGTTACATGTCTCC-L8TX_180221_01_C10,12.506742,-4.1611395 +10X_cells.CTGCCTACAAGGTTCT-L8TX_180221_01_G09,10.390955,-4.296465 +10X_cells.TGCTGCTAGGCAGGTT-L8TX_180221_01_F09,11.311263,-3.5118768 +10X_cells.CTCCTAGGTCGACTGC-L8TX_180221_01_G09,11.258046,-3.7282917 +10X_cells.GTGCGGTGTGAAATCA-L8TX_180221_01_H09,11.519005,-4.192783 +10X_cells.GTACTCCGTGGAAAGA-L8TX_180221_01_A10,10.36761,-4.303181 +10X_cells.GTACTTTTCCCAGGTG-L8TX_180221_01_A10,14.13399,-1.5251563 +10X_cells.TCAGATGGTCCCTACT-L8TX_180221_01_A10,13.616561,-1.9397093 +10X_cells.ACGCAGCCAGGCGATA-L8TX_180406_01_C06,13.950931,-2.9312663 +10X_cells.ACTGATGAGGGTTCCC-L8TX_180712_01_C06,10.225921,-4.343879 +10X_cells.TTGCCGTCAATTGCTG-L8TX_180221_01_H12,10.9406805,-4.1454253 +10X_cells.TTTGCGCGTTCTGAAC-L8TX_180221_01_H12,13.413119,-0.19110087 +10X_cells.TGAGAGGGTAAATACG-L8TX_180221_01_E09,10.291584,-4.2146015 +10X_cells.ACCGTAAGTAAGGGAA-L8TX_180221_01_C09,10.659514,-3.9556832 +10X_cells.GACGCGTTCGACCAGC-L8TX_180221_01_C09,12.116489,-2.7788615 +10X_cells.TCAACGAGTGCACCAC-L8TX_180221_01_C09,11.508574,-3.5886152 +10X_cells.CACACCTGTTACGTCA-L8TX_180221_01_D09,9.377462,-3.6520612 +10X_cells.CAGCATACACGGACAA-L8TX_180221_01_D09,10.15905,-3.9561038 +10X_cells.TTTACTGTCATCTGCC-L8TX_180712_01_G05,10.566084,-4.275432 +10X_cells.AACCATGAGATGTCGG-L8TX_180712_01_B06,14.386681,-2.7866924 +10X_cells.AGGTCATAGGAATCGC-L8TX_180712_01_B06,10.324726,-4.233121 +10X_cells.CTGTTTAAGTACGCGA-L8TX_180712_01_B06,11.86994,-3.7558277 +10X_cells.GCTCCTACAGTATGCT-L8TX_180712_01_B06,9.764575,-4.092719 +10X_cells.GTCTTCGCAGCTGTTA-L8TX_180712_01_B06,13.34882,-3.0759127 +Smartseq_cells.LS-15019_S23_E1-50,11.5607605,-4.446149 +Smartseq_cells.LS-15319_S81_E2-50,11.055058,-4.420833 +Smartseq_cells.LS-15320_S71_E2-50,10.9526205,-4.420511 +Smartseq_cells.LS-15320_S72_E2-50,12.306348,-4.4772525 +Smartseq_cells.LS-15324_S54_E2-50,8.118261,-3.3759172 +Smartseq_cells.LS-15499_S41_E1-50,11.877256,-4.6261034 +Smartseq_cells.SM-D9D9E_S16_E1-50,10.298417,-3.3122592 +10X_cells.GTAACTGGTAAACACA-L8TX_180829_01_D10,12.015016,-3.5266633 +10X_cells.ATTCTACCATAGACTC-L8TX_180829_01_D09,13.525654,-3.041004 +10X_cells.CACTCCATCGGAAACG-L8TX_180829_01_D10,11.906896,-2.3312864 +10X_cells.CACCTTGCAAGTAATG-L8TX_181011_01_G02,10.613481,-3.7746725 +10X_cells.TTAGTTCTCAACTCTT-L8TX_181012_01_E05,13.725922,-3.5152774 +10X_cells.TTCTACAGTGCAGACA-L8TX_181012_01_E05,13.532887,-3.0398667 +10X_cells.CTAGAGTGTATTACCG-L8TX_180406_01_E02,10.936184,-3.0140197 +Smartseq_cells.SM-GE91L_S050_E1-50,10.340109,-2.9093487 +Smartseq_cells.SM-GE91C_S361_E1-50,6.5765586,-1.1853306 +10X_cells.ACGCCAGGTTATCGGT-L8TX_171026_01_F05,11.623729,-3.089328 +10X_cells.AGAGTGGCATGGGAAC-L8TX_171026_01_B05,10.853536,-3.9179742 +10X_cells.GAGGTGATCAGTCCCT-L8TX_171026_01_A04,11.266629,-4.056302 +10X_cells.CAAGAAACATGGAATA-L8TX_171026_01_F03,9.340491,-3.908044 +10X_cells.ACTTACTTCATAGCAC-L8TX_171026_01_B04,13.357047,-3.7243252 +10X_cells.ATTGGACCACAGACAG-L8TX_171026_01_B04,13.118912,-4.1461706 +10X_cells.GCTCTGTGTCGCGAAA-L8TX_171026_01_B04,13.595277,-2.0156074 +10X_cells.CGAACATGTGAAAGAG-L8TX_171026_01_G04,11.610483,-4.389752 +10X_cells.CGTCAGGAGATGTCGG-L8TX_171026_01_H04,8.836167,-3.4441156 +10X_cells.GAACGGATCTTTACAC-L8TX_171026_01_H04,11.590218,-4.497107 +10X_cells.TTTGCGCTCTCAAACG-L8TX_171026_01_H04,12.05404,-4.4753947 +10X_cells.CATGACACAGTTTACG-L8TX_171026_01_A05,10.414645,-4.3393903 +10X_cells.GCAGCCATCCTCTAGC-L8TX_171026_01_A05,9.79232,-4.0864635 +10X_cells.GCACTCTCATGTCCTC-L8TX_171026_01_H03,12.4533615,-2.7974946 +10X_cells.TGAGCATCAGCGAACA-L8TX_171026_01_H03,11.704991,-3.5810297 +10X_cells.AGATTGCTCCATGAAC-L8TX_171026_01_C05,11.629805,-3.6604595 +10X_cells.GGCGACTGTTTCCACC-L8TX_171026_01_C05,14.433096,-2.2909107 +10X_cells.CATCGGGAGCGATCCC-L8TX_171026_01_D05,12.802992,-2.8335052 +10X_cells.ATTCTACGTGTAAGTA-L8TX_171026_01_G05,12.841473,-3.459018 +Smartseq_cells.SM-DD44N_S15_E1-50,10.3304825,-4.2093163 +Smartseq_cells.SM-GE92H_S005_E1-50,10.087925,-2.912684 +10X_cells.TAGACCAAGCAATCTC-L8TX_181206_01_H11,14.125706,-3.6635063 +10X_cells.CAGTCCTGTGGCAAAC-L8TX_181206_01_B12,13.054277,-3.7038524 +10X_cells.CTGCGGAGTAAACCTC-L8TX_181206_01_B12,12.147994,-3.5458694 +10X_cells.GGTGCGTTCTTGCCGT-L8TX_181206_01_B12,11.229577,-3.1823812 +10X_cells.GTGGGTCAGCCGGTAA-L8TX_181206_01_B12,9.752262,-4.0086994 +10X_cells.ATAAGAGGTCAACTGT-L8TX_181206_01_C12,11.731603,-2.4650848 +10X_cells.TCAGGTACAATGAATG-L8TX_181206_01_C12,11.66995,-3.778689 +10X_cells.CATCGAAAGAAGGCCT-L8TX_181206_01_D12,8.893122,-3.7315204 +10X_cells.TTCTACAAGCGTAATA-L8TX_181206_01_D12,9.953256,-3.5429103 +10X_cells.CCCAATCAGGGCACTA-L8TX_181206_01_F12,13.617677,-2.0056474 +10X_cells.GGATTACTCGCATGAT-L8TX_181206_01_E12,13.0064945,-3.437949 +10X_cells.CCCAGTTGTCTCTTAT-L8TX_180221_01_F10,13.249538,-2.987651 +10X_cells.GATCGCGTCCTCATTA-L8TX_180221_01_F10,10.286225,-4.1224504 +10X_cells.TTGCGTCCAGATCGGA-L8TX_180221_01_A11,11.467282,-3.687103 +10X_cells.CCACTACCACGGATAG-L8TX_180926_01_E12,14.254021,-3.43137 +10X_cells.TTTATGCAGTTCGCGC-L8TX_190312_01_E02,12.893754,-2.9454794 +10X_cells.CCAGCGAGTGTATGGG-L8TX_180221_01_B11,13.287212,-0.9607541 +10X_cells.GACGTTAGTCCAGTGC-L8TX_180221_01_C11,12.547186,-1.7630574 +10X_cells.GATGAGGGTCAGAGGT-L8TX_180221_01_C11,13.64626,-1.6529443 +10X_cells.CGGACACGTGCACCAC-L8TX_180221_01_D11,12.413612,-1.8053811 +10X_cells.GCGCCAAGTGTTTGGT-L8TX_180221_01_E11,13.537036,-0.6297023 +10X_cells.GTCTCGTTCAATACCG-L8TX_180907_01_A12,9.8197975,-3.5107248 +10X_cells.CTCGAGGCAAATCCGT-L8TX_180907_01_E11,13.134609,-2.7129955 +10X_cells.GGCGACTAGCCCAATT-L8TX_180926_01_B01,11.467928,-3.268736 +10X_cells.TGCACCTAGATCGATA-L8TX_181011_01_H03,10.174681,-3.3510835 +Smartseq_cells.SM-GE91G_S383_E1-50,10.85925,-4.1614146 +10X_cells.ACGCAGCAGTCCGTAT-L8TX_180712_01_F05,10.90377,-2.9464076 +10X_cells.ACCTTTACAACGATCT-L8TX_180221_01_C12,14.254486,-1.6799623 +10X_cells.CTGAAGTGTCCGACGT-L8TX_180115_01_B09,14.030868,-2.3198504 +10X_cells.TGACTTTGTGTAACGG-L8TX_180115_01_D10,13.752564,-0.78378755 +10X_cells.ACTTACTTCGCATGGC-L8TX_180115_01_A11,12.27566,-3.9034946 +10X_cells.TAAGAGATCGGCCGAT-L8TX_180115_01_H10,13.36454,-1.7175231 +10X_cells.GGTGTTAAGTCTCAAC-L8TX_180115_01_B11,9.909269,-2.7755315 +10X_cells.CCGTACTAGCAATATG-L8TX_180115_01_C11,13.07677,-1.8539096 +10X_cells.TTCGAAGAGGATTCGG-L8TX_180115_01_C11,12.441923,-1.829061 +10X_cells.AACCATGAGTGTACCT-L8TX_180115_01_F10,13.762537,-1.2164718 +10X_cells.AGCGTCGTCGTTGCCT-L8TX_171120_01_G07,10.348026,-3.2361314 +10X_cells.CTGAAGTCACATCCAA-L8TX_171120_01_G07,11.892989,-3.356563 +10X_cells.CATTATCTCAGTACGT-L8TX_180115_01_D08,10.722819,-4.3190103 +10X_cells.AAACCTGGTCCATGAT-L8TX_171120_01_D07,11.125988,-4.1785274 +10X_cells.CGACTTCTCTGCTTGC-L8TX_171120_01_D07,12.700649,-3.2947955 +10X_cells.CGGACGTAGGGTCTCC-L8TX_171120_01_E07,11.480329,-3.4633586 +Smartseq_cells.SM-GE94L_S263_E1-50,11.796722,-4.437177 +10X_cells.CTCACACGTAGCGTAG-L8TX_180221_01_A10,12.64968,-3.2835188 +10X_cells.CACAAACCATATGCTG-L8TX_180221_01_B10,11.946385,-4.1322737 +10X_cells.CTTCTCTGTCATATGC-L8TX_180221_01_B10,12.04072,-3.1187124 +10X_cells.GGACGTCGTTGGACCC-L8TX_180221_01_B10,12.140012,-3.064439 +10X_cells.TACTTACTCGGCGGTT-L8TX_180221_01_B10,13.084635,-4.4244404 +10X_cells.TGGGCGTCAGCCTTTC-L8TX_180221_01_H12,15.185713,-2.2358851 +10X_cells.CATCGGGCACCAACCG-L8TX_180221_01_E09,15.985692,-2.3227599 +10X_cells.CCACCTATCGGATGTT-L8TX_180221_01_C09,12.920942,-3.521591 +10X_cells.CATATGGAGGACAGAA-L8TX_180607_01_C05,13.510381,-1.1935613 +10X_cells.ACGATACTCTCTGTCG-L8TX_180712_01_G05,12.490831,-4.426902 +10X_cells.TGAGCATAGCACAGGT-L8TX_180712_01_G05,16.005056,-2.1967108 +10X_cells.TCATTTGTCTGGCGTG-L8TX_180712_01_B06,11.998068,-4.2958746 +10X_cells.TGATTTCCAAGAGGCT-L8TX_180712_01_C06,13.499506,-3.780356 +Smartseq_cells.SM-GE67M_S358_E1-50,12.953608,-4.2632203 +Smartseq_cells.LS-15084_S59_E1-50,12.771795,-4.2276163 +10X_cells.GACTGCGGTGGTGTAG-L8TX_180829_01_D09,15.543628,-0.27137592 +10X_cells.GTTCATTTCCTTGGTC-L8TX_180829_01_D09,12.429778,0.015367501 +10X_cells.CAACCTCCATTGGTAC-L8TX_180907_01_F10,13.479766,-0.18048503 +10X_cells.CTGGTCTTCACCCGAG-L8TX_180907_01_F10,13.937936,-3.4784403 +10X_cells.TCGGGACCACGGACAA-L8TX_181011_01_G02,12.973605,-3.9368281 +10X_cells.CTTACCGTCTTCCTTC-L8TX_181012_01_G04,13.728649,-2.930957 +Smartseq_cells.SM-GE5V6_S154_E1-50,12.688965,-3.947428 +Smartseq_cells.SM-GE65S_S257_E1-50,11.616052,-3.997575 +10X_cells.GAACCTATCCAAACTG-L8TX_171026_01_G04,12.0501995,-3.8783827 +10X_cells.GAACGGATCTGCAAGT-L8TX_171026_01_F03,15.872766,-1.8017123 +10X_cells.CAAGAAAGTTATGCGT-L8TX_171026_01_A05,14.423986,-1.7115923 +10X_cells.CCACCTATCAGGTTCA-L8TX_171026_01_H03,15.809702,-1.5575585 +10X_cells.CTGTGCTAGGTCGGAT-L8TX_171026_01_H03,15.353354,-1.1524351 +10X_cells.GTTCATTGTAAATGTG-L8TX_171026_01_E05,13.587443,-4.0300817 +10X_cells.CTCTACGAGGATGCGT-L8TX_171026_01_F05,12.139276,-3.1812115 +10X_cells.GATTCAGTCTTAGAGC-L8TX_171026_01_G05,12.261077,-1.3487498 +10X_cells.GGGAGATGTACTCTCC-L8TX_181206_01_H11,12.870728,-1.3593608 +10X_cells.TCGCGTTAGAACAACT-L8TX_190312_01_D02,14.018048,-2.6618564 +10X_cells.TCACAAGGTTACGCGC-L8TX_180221_01_D10,13.343749,-3.8856764 +10X_cells.ACTTACTTCCATGCTC-L8TX_180221_01_E10,13.946081,-4.306358 +10X_cells.CGTGTCTTCCGTTGCT-L8TX_180221_01_G10,16.102133,5.2749066 +10X_cells.GACGCGTTCTAGCACA-L8TX_180221_01_G10,11.228259,-3.6353517 +10X_cells.CCGGTAGCAATGCCAT-L8TX_190312_01_G02,13.726326,0.09684235 +10X_cells.ACTTTCAGTTGAGGTG-L8TX_181012_01_C05,14.623375,-3.4771621 +10X_cells.GTCAAGTGTTTGACTG-L8TX_180221_01_D11,12.85002,-2.265383 +10X_cells.CCCTCCTGTAGTACCT-L8TX_180221_01_B11,14.000347,-1.907341 +10X_cells.CTTACCGAGGACACCA-L8TX_180221_01_B11,13.594213,-1.5309769 +10X_cells.GTAACTGTCAGCAACT-L8TX_180221_01_B11,13.023757,-1.9644239 +10X_cells.CCCTCCTCAACACCTA-L8TX_180221_01_C11,13.755821,-2.512783 +10X_cells.CTAGTGACAGTCTTCC-L8TX_180221_01_C11,12.631545,-2.7043526 +10X_cells.TTCTACACATGCCCGA-L8TX_180221_01_C11,12.702299,-2.245492 +10X_cells.TATCAGGCAGCTCGCA-L8TX_180221_01_D11,13.491837,-1.0271286 +Smartseq_cells.SM-GE67Q_S172_E1-50,12.722321,-3.7280507 +Smartseq_cells.SM-GE67Q_S223_E1-50,13.579727,-4.074158 +Smartseq_cells.SM-GE67Q_S373_E1-50,14.690025,-3.669357 +10X_cells.TCGAGGCGTGGCAAAC-L8TX_180907_01_E11,13.028668,-4.4423957 +10X_cells.CATCGAACATGGATGG-L8TX_180926_01_B01,13.633919,-3.3389971 +10X_cells.ACTGAGTAGTTCGCAT-L8TX_181011_01_A03,13.155213,-3.7444122 +10X_cells.TGAGCCGCACCAGGCT-L8TX_180712_01_H05,16.663107,-1.8889982 +10X_cells.ATAGACCTCTGAGTGT-L8TX_180712_01_F05,11.534681,-3.6707447 +10X_cells.TGCTGCTGTTACGGAG-L8TX_180712_01_E05,12.737705,-2.241732 +10X_cells.ATCTGCCTCTGGCGAC-L8TX_180712_01_F05,16.43622,0.043186266 +10X_cells.GTCTCGTGTCTTCTCG-L8TX_180712_01_A06,11.605005,-3.5725274 +10X_cells.ATAACGCCAATCGAAA-L8TX_180221_01_A12,14.000308,0.29101354 +10X_cells.GAATGAATCGGCGCAT-L8TX_180221_01_A12,13.847644,-0.39814845 +10X_cells.GATGAAATCTACTCAT-L8TX_180221_01_C12,15.4105835,-0.12647846 +10X_cells.GCAGTTATCCTCAACC-L8TX_180221_01_C12,12.192652,-2.9295962 +10X_cells.TTATGCTCACGAAGCA-L8TX_180221_01_H11,6.3938017,1.953345 +10X_cells.CACATAGAGCTGGAAC-L8TX_180115_01_H10,15.185707,-1.9967753 +10X_cells.GGAAAGCAGGATTCGG-L8TX_180115_01_H11,16.837254,-0.65832 +10X_cells.GTCGGGTCATCGGGTC-L8TX_180115_01_A09,13.650602,-2.8114135 +10X_cells.GTCCTCATCAACTCTT-L8TX_180115_01_C09,15.471236,-1.887615 +10X_cells.TCAGGATTCTTGTATC-L8TX_180115_01_C09,14.989434,-2.6933174 +10X_cells.TGTCCCAAGTACGACG-L8TX_180115_01_D09,13.435832,-1.2245456 +10X_cells.GTACTTTAGAGCTATA-L8TX_180115_01_A11,14.015797,-1.5104923 +10X_cells.CACAGGCCAATAGCGG-L8TX_180115_01_H10,15.249272,-2.0769417 +10X_cells.CACCAGGGTGCAACTT-L8TX_180115_01_B11,13.911896,-2.0985827 +10X_cells.CTCGTCAGTACCTACA-L8TX_180115_01_C10,16.034035,0.12968051 +10X_cells.AGATCTGCAAGGCTCC-L8TX_180115_01_D11,14.436078,-1.4025083 +10X_cells.CCGGGATTCGTAGGAG-L8TX_180115_01_D11,14.581533,-1.5506909 +10X_cells.ATTGGACTCATGGTCA-L8TX_180115_01_G10,14.27043,-3.6982684 +10X_cells.CCTACCACACAGGTTT-L8TX_180115_01_G10,13.7064085,-1.5092125 +10X_cells.ACACCGGGTAGGGACT-L8TX_180115_01_E11,13.035042,-3.1217396 +10X_cells.TATTACCGTTTGGCGC-L8TX_180115_01_E11,13.262624,-3.9373302 +10X_cells.ATGCGATAGAATTCCC-L8TX_180115_01_F11,13.364287,-3.813128 +10X_cells.AGATCTGGTCACACGC-L8TX_180115_01_G11,13.109399,-3.7037132 +10X_cells.GACTGCGGTATTCGTG-L8TX_180115_01_G11,15.078269,-3.014859 +10X_cells.TAGTTGGTCATTGCCC-L8TX_180115_01_G11,13.433791,-4.0649924 +10X_cells.GCGCCAAAGGCATGGT-L8TX_180115_01_H11,13.004332,-4.004821 +10X_cells.TGGGCGTAGAGTAAGG-L8TX_180115_01_H11,13.225626,-3.7178516 +10X_cells.CTCCTAGTCCTTCAAT-L8TX_180115_01_A10,14.358371,-1.7541566 +10X_cells.TGACAACAGAAACGCC-L8TX_180115_01_A10,12.669733,-0.8277348 +10X_cells.CTAAGACCACTGAAGG-L8TX_180115_01_E09,14.782283,-1.0887388 +10X_cells.GAATAAGAGATGTGGC-L8TX_180115_01_E09,13.536798,-1.3609929 +10X_cells.TAAGTGCAGTATTGGA-L8TX_180115_01_F09,13.320952,-1.2294025 +10X_cells.CTGCTGTTCATAAAGG-L8TX_171120_01_G07,14.24369,-3.9188123 +10X_cells.TGGTTAGAGTTTGCGT-L8TX_180115_01_G08,13.047195,-4.200412 +10X_cells.TGGCTGGGTCCTGCTT-L8TX_180115_01_H08,12.149636,-4.1762524 +10X_cells.ATAGACCCAGGAATCG-L8TX_180115_01_D08,11.614397,-4.3415914 +10X_cells.CGAATGTCACATAACC-L8TX_180115_01_D08,14.253871,-2.7347867 +10X_cells.CGATGTACACATGGGA-L8TX_171120_01_D07,12.742701,-3.4050515 +10X_cells.AATCCAGAGATGAGAG-L8TX_171120_01_F07,16.271793,-1.2834597 +10X_cells.CGACCTTGTTACCGAT-L8TX_180115_01_E08,13.433995,-3.949559 +10X_cells.TCTGGAACAACGATGG-L8TX_180115_01_E08,12.223127,-4.4664173 +Smartseq_cells.LS-15007_S80_E1-50,13.118291,-4.0876083 +Smartseq_cells.LS-15033_S73_E1-50,13.139803,-4.273052 +Smartseq_cells.LS-15033_S78_E1-50,14.772776,-3.6369374 +Smartseq_cells.LS-15347_S85_E1-50,13.79619,-4.1789513 +Smartseq_cells.LS-15576_S74_E1-50,12.266959,-3.6086555 +Smartseq_cells.SM-DD43V_S65_E1-50,14.137611,-4.184274 +Smartseq_cells.SM-DD45L_S095_E1-50,14.778574,-3.1975644 +Smartseq_cells.SM-GE631_S088_E1-50,14.390585,-4.161963 +Smartseq_cells.SM-GE631_S147_E1-50,13.436736,-3.4476073 +Smartseq_cells.SM-GE64U_S068_E1-50,14.234945,-4.283828 +Smartseq_cells.SM-GE64C_S053_E1-50,12.09222,-3.8183002 +Smartseq_cells.SM-GE94L_S244_E1-50,13.996113,-3.5119317 +10X_cells.TAAGAGAGTATAGGGC-L8TX_180221_01_A10,14.619846,5.521344 +10X_cells.GCGGGTTGTCTAAACC-L8TX_180221_01_F09,15.990678,4.4432793 +10X_cells.AGAGTGGAGTGGAGTC-L8TX_180221_01_A10,15.202864,3.7658014 +10X_cells.CTCGGAGGTGTCAATC-L8TX_180221_01_A10,15.309753,4.1841335 +10X_cells.CCACCTATCCTTGCCA-L8TX_180221_01_B10,16.19516,4.4602046 +10X_cells.CATTCGCCATCCTAGA-L8TX_180221_01_C10,15.213802,4.213361 +10X_cells.GTGCGGTTCCACGAAT-L8TX_180221_01_C10,13.207535,3.3300056 +10X_cells.ACTGAACTCTCGTATT-L8TX_180406_01_F02,14.479187,4.344537 +10X_cells.AGTGGGAGTACTCAAC-L8TX_180406_01_C06,14.340436,2.5018542 +10X_cells.TTCTCCTCATCAGTAC-L8TX_180406_01_C06,13.889521,3.6161928 +10X_cells.CATTATCCAGCCTTTC-L8TX_180221_01_E09,15.697713,4.0109973 +10X_cells.AACCGCGAGTAGTGCG-L8TX_180221_01_E09,14.87136,2.5026093 +10X_cells.CTAGAGTCAGTCGTGC-L8TX_180221_01_E09,13.305779,1.9226434 +10X_cells.GATGAGGGTTATGTGC-L8TX_180221_01_E09,15.392801,2.7815325 +10X_cells.GTCCTCAGTATTCTCT-L8TX_180221_01_E09,15.694505,3.7415178 +10X_cells.TGAGAGGAGAATTGTG-L8TX_180221_01_E09,13.634278,2.3518317 +10X_cells.AGATTGCTCAGAAATG-L8TX_180221_01_C09,13.4662285,2.139555 +10X_cells.AGCTCTCCAATGGAGC-L8TX_180221_01_C09,15.186123,3.2179072 +10X_cells.ATTGGACGTAGGCTGA-L8TX_180221_01_C09,13.477762,2.0855393 +10X_cells.AGAATAGAGGCTAGCA-L8TX_180221_01_D09,14.364554,2.4929414 +10X_cells.CCAGCGATCGACAGCC-L8TX_180221_01_D09,14.092375,2.2125127 +10X_cells.CCGTGGAAGTAACCCT-L8TX_180221_01_D09,13.257031,1.8516932 +10X_cells.CGATGGCAGTAGCCGA-L8TX_180221_01_D09,13.289266,1.7870432 +10X_cells.GACTGCGGTATGCTTG-L8TX_180221_01_D09,14.697627,2.4595292 +10X_cells.GTCAAGTAGGAGCGTT-L8TX_180221_01_D09,13.259075,1.6731358 +10X_cells.GTGCTTCAGCACCGCT-L8TX_180221_01_D09,13.85905,2.189187 +10X_cells.TAAACCGAGAGTACAT-L8TX_180221_01_D09,13.771853,3.3695612 +10X_cells.CCTAAAGTCTGAAAGA-L8TX_180607_01_C05,14.09347,4.3330107 +10X_cells.CCCAATCGTGGTTTCA-L8TX_180712_01_G05,13.764869,3.0189204 +10X_cells.ATTGGTGCACCATGTA-L8TX_180712_01_B06,13.805809,3.0662003 +10X_cells.GAATGAATCATACGGT-L8TX_180712_01_C06,14.708536,4.1045427 +Smartseq_cells.LS-15313_S42_E2-50,15.8576145,4.84705 +Smartseq_cells.LS-15376_S80_E1-50,17.505072,3.1377738 +10X_cells.CGATCGGTCTGGTTCC-L8TX_180829_01_D09,13.556584,3.0845585 +10X_cells.CGTCCATTCAACGGGA-L8TX_180829_01_D09,13.578874,2.8510883 +10X_cells.TGACGGCAGGTGTTAA-L8TX_180829_01_E10,14.460607,3.769789 +10X_cells.AAAGATGTCGCAAGCC-L8TX_181011_01_C04,14.001176,2.0268037 +10X_cells.CAGGTGCTCGGTGTTA-L8TX_181012_01_G04,13.516361,2.4501314 +10X_cells.CGTGAGCGTGAGGGTT-L8TX_181012_01_G04,14.031422,3.8847153 +10X_cells.CTCTGGTCATGGTCTA-L8TX_181012_01_E05,14.87092,3.7551937 +10X_cells.AACTCAGCACCATGTA-L8TX_171026_01_A05,15.427305,3.5450127 +10X_cells.CATATTCTCAGCACAT-L8TX_171026_01_F03,14.438743,3.9653397 +10X_cells.GCATGTACACTAGTAC-L8TX_171026_01_G03,15.028215,3.1832845 +10X_cells.AACTCCCGTGTGCGTC-L8TX_171026_01_B04,14.917232,3.62822 +10X_cells.ACCTTTATCACCGTAA-L8TX_171026_01_B04,13.92226,3.9628382 +10X_cells.CCGGGATCACTGAAGG-L8TX_171026_01_B04,13.865475,3.9630694 +10X_cells.TTTGCGCCAATAAGCA-L8TX_171026_01_B04,15.8175955,4.5319395 +10X_cells.CGCTATCGTTAAGTAG-L8TX_171026_01_G04,15.260626,4.1259837 +10X_cells.CTCGTCAAGCCCGAAA-L8TX_171026_01_B05,14.334939,4.12723 +10X_cells.TCAGGTATCCCGACTT-L8TX_171026_01_H04,16.301058,4.4335227 +10X_cells.ACTGTCCTCTTAGCCC-L8TX_171026_01_A05,14.841446,3.8184254 +10X_cells.AGCTCCTCACCCATGG-L8TX_171026_01_A05,15.365943,3.7234805 +10X_cells.CGCTTCACAATGTAAG-L8TX_171026_01_A04,14.850138,4.3142195 +10X_cells.TTGACTTCAGCCTGTG-L8TX_171026_01_A04,15.559451,3.941829 +10X_cells.CAGATCATCAGGTAAA-L8TX_171026_01_E05,14.980805,3.4003007 +10X_cells.CTAGTGACAGATGGGT-L8TX_171026_01_F05,14.010325,2.8566763 +10X_cells.TAAGAGACAACGATCT-L8TX_171026_01_F05,15.414616,3.8221257 +10X_cells.CGCGTTTAGCGATAGC-L8TX_171026_01_G05,13.04482,2.7383687 +10X_cells.CTGTTTAAGAGTTGGC-L8TX_171026_01_G05,14.158406,2.866864 +10X_cells.GGTATTGTCAGTCAGT-L8TX_171026_01_G05,15.506996,2.6352885 +Smartseq_cells.SM-D9D85_S52_E1-50,15.634297,5.215567 +Smartseq_cells.SM-DD449_S67_E1-50,16.900692,3.046394 +10X_cells.TCGAGGCAGATGTCGG-L8TX_181206_01_E12,13.328782,2.9322293 +10X_cells.TACTTGTGTTCGAATC-L8TX_180406_01_G01,14.050356,6.2229733 +10X_cells.CATATTCGTACTTAGC-L8TX_180406_01_G01,14.255954,5.44175 +10X_cells.GACTGCGTCCGAAGAG-L8TX_180406_01_D02,13.762754,5.7882876 +10X_cells.CATCGAACAAGTTGTC-L8TX_190312_01_D02,14.520643,5.6355114 +10X_cells.AGGCCGTAGCGTAGTG-L8TX_180221_01_D10,14.646798,4.1586776 +10X_cells.CGCGTTTAGGTAGCCA-L8TX_180221_01_D10,14.379926,4.097123 +10X_cells.AAAGATGGTTAGAACA-L8TX_180221_01_E10,14.213042,3.983835 +10X_cells.GATGAGGAGCAATCTC-L8TX_180221_01_E10,14.150867,3.9348798 +10X_cells.TAGTTGGCAGACGCAA-L8TX_180221_01_E10,15.465911,3.1410544 +10X_cells.ACGAGGAAGCAGCGTA-L8TX_180221_01_F10,14.86255,4.1115823 +10X_cells.CGTAGGCCATTCGACA-L8TX_180221_01_F10,15.339305,4.044633 +10X_cells.CTCTACGAGATGCCTT-L8TX_180221_01_F10,15.167951,3.9140062 +10X_cells.CTGGTCTCAAGGGTCA-L8TX_180221_01_F10,13.557257,3.7214425 +10X_cells.GAAACTCCAGATGGGT-L8TX_180221_01_F10,12.931591,2.577393 +10X_cells.GCTGCTTAGGATATAC-L8TX_180221_01_F10,14.263903,3.9210331 +10X_cells.ACGCCGAAGGGCTCTC-L8TX_180221_01_G10,15.238042,3.9584625 +10X_cells.TACACGACACTTACGA-L8TX_180221_01_G10,14.0744505,4.148598 +10X_cells.AGGCCACGTTCAACCA-L8TX_180221_01_A11,12.899171,2.5415916 +10X_cells.AGTGAGGTCCGGCACA-L8TX_180221_01_A11,14.3770485,3.655706 +10X_cells.ATAAGAGTCCTACAGA-L8TX_180221_01_A11,14.351499,3.4252157 +10X_cells.CTGATAGTCTCTAGGA-L8TX_180221_01_A11,14.801726,3.6536682 +10X_cells.TAAACCGTCCTGTACC-L8TX_180221_01_A11,14.297539,4.489456 +10X_cells.TGTCCCATCCTAAGTG-L8TX_180221_01_A11,14.493082,4.374327 +10X_cells.GTCTTCGGTCAGAGGT-L8TX_190312_01_B02,15.554035,3.987583 +10X_cells.TTAGGACAGACGCACA-L8TX_190312_01_D02,14.929715,4.1676526 +10X_cells.CGTAGGCCATATACGC-L8TX_180221_01_B11,14.212525,2.114979 +10X_cells.TCCACACAGTGTCCCG-L8TX_180221_01_B11,13.258111,1.6566008 +10X_cells.CTAGCCTGTACGCTGC-L8TX_180221_01_D11,15.1652565,2.7953987 +10X_cells.AGCTCTCTCTCACATT-L8TX_180221_01_F11,16.271374,4.6938443 +10X_cells.CTAATGGAGTGTACCT-L8TX_180907_01_A12,15.60558,4.6859508 +10X_cells.CACTCCATCTACCAGA-L8TX_180907_01_B12,14.500174,4.248551 +10X_cells.TCTGAGAAGGGAAACA-L8TX_180907_01_E11,13.521595,3.0671797 +10X_cells.ACGGCCAAGAGCTGGT-L8TX_180926_01_D01,13.9094925,3.8191278 +10X_cells.CTCAGAAAGACTAGAT-L8TX_180926_01_D01,13.182322,3.7409232 +10X_cells.GGTGTTAAGGATGGTC-L8TX_180926_01_D01,14.955514,4.068969 +10X_cells.ATTTCTGAGCGCTCCA-L8TX_181011_01_A03,15.589427,3.517346 +10X_cells.AATCCAGAGCCACTAT-L8TX_180712_01_H05,14.797243,4.1640825 +10X_cells.TAGGCATTCGGCCGAT-L8TX_180712_01_F05,13.3751335,3.5611665 +10X_cells.CTCTAATTCTTGCCGT-L8TX_180712_01_H05,14.633731,3.973217 +10X_cells.CGGTTAATCACAACGT-L8TX_180712_01_A06,14.781376,4.4372983 +10X_cells.ACCTTTATCCGTAGTA-L8TX_180504_01_E01,14.189178,4.190603 +10X_cells.CACACTCCACGAGAGT-L8TX_180504_01_E01,15.683033,4.2058845 +10X_cells.CATTATCTCGCCAAAT-L8TX_180504_01_E01,14.000398,3.4803696 +10X_cells.GGGCACTCATGGATGG-L8TX_180504_01_E01,14.2153635,4.152274 +10X_cells.AGGCCACAGGCATGGT-L8TX_180221_01_A12,13.796943,1.6918911 +10X_cells.ACGCAGCGTTCGGGCT-L8TX_180221_01_B12,13.452457,3.0679007 +10X_cells.CACATTTTCTTGCAAG-L8TX_180221_01_B12,14.005048,4.0707307 +10X_cells.CTCGAGGAGAATTGTG-L8TX_180221_01_C12,13.360658,2.1906018 +10X_cells.TACGGATAGTCATCCA-L8TX_180221_01_C12,14.05518,4.34353 +10X_cells.TTTATGCTCGAGAACG-L8TX_180221_01_D12,13.406024,3.496713 +10X_cells.TACCTTAAGGTGCAAC-L8TX_180115_01_G10,13.33833,1.9939817 +10X_cells.AGGTCCGCAAACGTGG-L8TX_180115_01_A09,14.851404,4.18502 +10X_cells.GGACATTGTTAAAGTG-L8TX_180115_01_A09,14.914348,4.3047185 +10X_cells.TACTCATAGTCACGCC-L8TX_180115_01_A09,14.479495,3.460796 +10X_cells.AGTGAGGTCGCCATAA-L8TX_180115_01_A11,15.159947,2.9328659 +10X_cells.GCGAGAAAGTACATGA-L8TX_180115_01_A11,14.132121,1.934906 +10X_cells.GGCAATTCATAGAAAC-L8TX_180115_01_B10,14.035617,1.8800776 +10X_cells.GTTCATTGTCTCATCC-L8TX_180115_01_B11,15.222981,2.754819 +10X_cells.CATCAAGGTGCCTGTG-L8TX_180115_01_C11,13.609365,2.265159 +10X_cells.ATAACGCCAGATCGGA-L8TX_180115_01_D11,14.06524,3.8796864 +10X_cells.AGCGTCGCATTAGGCT-L8TX_180115_01_E10,13.438297,1.9184871 +10X_cells.CTACGTCTCGCCAGCA-L8TX_180115_01_E10,14.996436,2.6729705 +10X_cells.TTATGCTCAGGTGCCT-L8TX_180115_01_E10,15.403536,3.4292412 +10X_cells.AGCAGCCCATCGATGT-L8TX_180115_01_F10,14.996485,2.744093 +10X_cells.CAACCTCCATTCCTGC-L8TX_180115_01_F10,14.593296,1.6845607 +10X_cells.GAAATGAAGAGTCGGT-L8TX_180115_01_F10,13.92439,1.8216803 +10X_cells.CAGCTAAAGATTACCC-L8TX_180115_01_E11,14.775848,4.089065 +10X_cells.CTCACACTCTCTTGAT-L8TX_180115_01_E11,14.99129,4.070511 +10X_cells.GACCAATGTTCTCATT-L8TX_180115_01_E11,14.233197,3.957837 +10X_cells.ACATCAGGTACTTGAC-L8TX_180115_01_F11,15.563531,4.2313643 +10X_cells.AGTCTTTCAGTTCCCT-L8TX_180115_01_F11,15.684896,4.447797 +10X_cells.GGTATTGAGTATCTCG-L8TX_180115_01_F11,13.097039,3.1556911 +10X_cells.TGGACGCAGACATAAC-L8TX_180115_01_G11,15.732308,3.6369188 +10X_cells.TTGACTTCAAGTTCTG-L8TX_180115_01_G11,15.827416,3.7904513 +10X_cells.AAGCCGCAGAGACGAA-L8TX_180115_01_H11,13.023633,2.9079719 +10X_cells.CGCTTCATCAAAGACA-L8TX_180115_01_H11,15.293105,3.883743 +10X_cells.TCTTCGGTCAACGGCC-L8TX_180115_01_H11,13.63974,3.8559022 +10X_cells.TGGCCAGCAAGGTTTC-L8TX_180115_01_H11,15.542507,4.2546325 +10X_cells.CATCCACGTCCGAATT-L8TX_180115_01_E09,13.327108,2.030457 +10X_cells.CCCATACAGAGTACAT-L8TX_180115_01_E09,15.691032,3.553831 +10X_cells.TTAGGACGTCTCCCTA-L8TX_180115_01_E09,13.399894,1.9577061 +10X_cells.AAATGCCTCGAGCCCA-L8TX_171120_01_H07,15.75688,3.9617631 +10X_cells.ATTGGTGCATTGTGCA-L8TX_171120_01_H07,15.361993,3.8115137 +10X_cells.CACATTTCACAAGCCC-L8TX_180115_01_G08,16.334366,4.4628096 +10X_cells.GCGCAACGTCTAGTGT-L8TX_171120_01_C07,14.054911,3.7155745 +10X_cells.CATCGGGTCTCAAGTG-L8TX_180115_01_D08,14.241031,4.3323627 +10X_cells.CGAACATGTGATGATA-L8TX_171120_01_D07,13.698592,3.6972013 +10X_cells.TGATTTCCACGAAACG-L8TX_171120_01_F07,14.708726,3.7088196 +10X_cells.GGGACCTAGTGGAGAA-L8TX_180115_01_E08,15.851285,4.033632 +10X_cells.TCATTACAGTGGTCCC-L8TX_180115_01_E08,16.640602,4.092319 +Smartseq_cells.LS-15032_S25_E1-50,15.510219,5.046557 +Smartseq_cells.SM-DD45I_S026_E1-50,15.427102,5.0354495 +Smartseq_cells.SM-DD45I_S124_E1-50,15.881299,4.325508 +Smartseq_cells.SM-GE8ZW_S141_E1-50,16.325306,4.78914 +Smartseq_cells.SM-GE94L_S188_E1-50,15.610474,4.795569 +10X_cells.TCTCATAAGACTGGGT-L8TX_180221_01_F09,4.970968,-2.226126 +10X_cells.CATATTCTCGCTAGCG-L8TX_180406_01_C06,13.735319,1.6626437 +10X_cells.CTTACCGAGCTACCGC-L8TX_180221_01_F09,14.616975,3.7499907 +10X_cells.CACAGTATCCGCGTTT-L8TX_180406_01_F02,16.975624,3.421386 +10X_cells.GGCAATTGTTCTCATT-L8TX_180221_01_B10,17.510899,4.3493214 +10X_cells.CTCACACCATTCCTGC-L8TX_180406_01_F02,16.790825,4.1242514 +10X_cells.CGTGAGCCATCCTTGC-L8TX_180221_01_A10,15.122746,-0.48901826 +10X_cells.GTCACAAGTCCGTGAC-L8TX_180221_01_F09,17.519316,4.1914825 +10X_cells.CGGGTCAGTATCAGTC-L8TX_180221_01_A10,14.080268,2.8299797 +10X_cells.CCACTACCATTCTTAC-L8TX_180221_01_B10,16.853893,-1.1139542 +10X_cells.GTTAAGCAGTCAAGGC-L8TX_180221_01_G09,16.768835,0.8397099 +10X_cells.TTTATGCAGCTTCGCG-L8TX_180406_01_F02,17.287933,3.0329204 +10X_cells.AAGGTTCTCCCAAGTA-L8TX_180406_01_F02,15.444352,1.0211257 +10X_cells.CTAATGGCATAAGACA-L8TX_180221_01_F09,18.053902,1.9280806 +10X_cells.TCAGATGTCTTAACCT-L8TX_180221_01_B10,16.87116,1.3418258 +10X_cells.TACGGGCCATGAGCGA-L8TX_180406_01_F02,13.242134,4.344018 +10X_cells.CCTACCAGTGTGACCC-L8TX_180406_01_C06,14.0461035,1.8979697 +10X_cells.AACCATGCAGCTTCGG-L8TX_180221_01_F09,16.671724,4.1290054 +10X_cells.CGGTTAATCCGCAGTG-L8TX_180221_01_F09,17.05578,5.1650753 +10X_cells.CTGATAGCAATAGCGG-L8TX_180406_01_F02,15.322139,2.2224302 +10X_cells.GACTACACAGGCGATA-L8TX_180406_01_C06,15.639903,2.0170355 +10X_cells.ACTTGTTCAGGTCTCG-L8TX_180221_01_H09,17.576326,-0.73793566 +10X_cells.CTTAGGATCCTCCTAG-L8TX_180221_01_H09,16.554745,-1.3545164 +10X_cells.AATCCAGAGCTAGGCA-L8TX_180221_01_C10,14.829276,1.8323115 +10X_cells.CCACGGAAGCTGGAAC-L8TX_180221_01_C10,17.668724,3.3131695 +10X_cells.TTATGCTCAGCTTCGG-L8TX_180221_01_G09,15.808193,3.920272 +10X_cells.GGAATAAGTAGCGCTC-L8TX_180221_01_C10,16.95147,1.7344576 +10X_cells.AAGACCTTCGGTGTTA-L8TX_180221_01_C10,14.511659,-4.0849853 +10X_cells.TGCTACCCATTCCTGC-L8TX_180221_01_G09,15.760173,3.8741527 +10X_cells.GCGCGATGTCCGAGTC-L8TX_180406_01_F02,16.539,2.4726431 +10X_cells.CGGACACTCAGCAACT-L8TX_180221_01_C10,16.309889,-2.5291939 +10X_cells.CAGCGACCATCACCCT-L8TX_180221_01_A10,16.024347,3.6273398 +10X_cells.CGTCTACTCGCCTGTT-L8TX_180406_01_F02,14.6063,2.4910364 +10X_cells.ATTGGTGGTAAGGATT-L8TX_180221_01_F09,17.872967,2.9837632 +10X_cells.CTGAAGTGTAGGGACT-L8TX_180221_01_G09,14.132946,2.7336435 +10X_cells.TTGGAACGTCTCAACA-L8TX_180406_01_C06,17.178442,0.58010674 +10X_cells.GGATGTTTCTGTCAAG-L8TX_180221_01_C10,14.703025,-1.3941975 +10X_cells.GCAATCATCTTCAACT-L8TX_180406_01_C06,15.537415,2.7815812 +10X_cells.TCAGGATGTTGATTGC-L8TX_180221_01_C10,17.15058,3.0776465 +10X_cells.GTTCATTCAGGACCCT-L8TX_180221_01_F09,18.231373,1.6369944 +10X_cells.ATGTGTGAGCCGTCGT-L8TX_180221_01_A10,17.181871,-1.005205 +10X_cells.TACTCGCAGTTCGCAT-L8TX_180406_01_F02,18.186678,3.4175406 +10X_cells.AAGGTTCGTAGCGTCC-L8TX_180221_01_C10,13.415914,-3.6653783 +10X_cells.CGCTTCAGTTCCATGA-L8TX_180406_01_C06,14.614261,1.8009307 +10X_cells.GCATGATGTCATCCCT-L8TX_180221_01_B10,16.914871,1.6054711 +Smartseq_cells.SM-DD45D_S121_E1-50,18.008938,3.859527 +10X_cells.CAAGGCCGTACAAGTA-L8TX_180712_01_B06,17.50666,-0.018752195 +10X_cells.ATCATGGAGTGTTTGC-L8TX_180712_01_B06,14.80686,3.1245034 +10X_cells.ACATCAGAGAGTAAGG-L8TX_180712_01_G05,16.250477,-2.4097817 +10X_cells.TACCTATCATTATCTC-L8TX_180221_01_D09,15.740302,-1.4581187 +10X_cells.TGACAACGTACCAGTT-L8TX_180221_01_D09,14.545635,2.3597484 +10X_cells.CTGCCTAGTTTAGGAA-L8TX_180221_01_C09,14.7982235,1.5320066 +10X_cells.AGGGAGTTCCGCGGTA-L8TX_180712_01_B06,16.980995,3.5223706 +10X_cells.ATGAGGGGTGGTAACG-L8TX_180712_01_G05,15.35845,1.871491 +10X_cells.GGATTACAGAGGTTGC-L8TX_180221_01_D09,13.830335,2.2412853 +10X_cells.GTAACTGGTGACAAAT-L8TX_180712_01_B06,14.493199,0.7698006 +10X_cells.TCAGCAATCTTGTTTG-L8TX_180712_01_B06,14.559536,0.64580685 +10X_cells.TGTTCCGAGGGATCTG-L8TX_180712_01_C06,14.120752,3.1878786 +10X_cells.TGGGAAGTCCTGCAGG-L8TX_180221_01_E09,17.70629,3.8148897 +10X_cells.GCGCAACGTGGCTCCA-L8TX_180221_01_C09,15.065125,1.2802409 +10X_cells.TGCGTGGGTTAGTGGG-L8TX_180712_01_B06,14.356997,1.4528906 +10X_cells.ATCCACCGTCGCGTGT-L8TX_180221_01_E09,14.804282,0.40234026 +10X_cells.TCTGAGACACATTCGA-L8TX_180712_01_B06,14.364154,4.002929 +10X_cells.CGGAGTCTCAGCACAT-L8TX_180712_01_B06,16.045137,0.91891533 +10X_cells.AAGACCTAGAGGTAGA-L8TX_180221_01_C09,15.547176,0.82954055 +10X_cells.GCTCTGTTCATGGTCA-L8TX_180712_01_B06,15.284428,2.2986643 +10X_cells.AACGTTGCACCCATGG-L8TX_180712_01_C06,16.430468,-0.44655636 +10X_cells.CTCGAGGTCGAACGGA-L8TX_180712_01_B06,15.111813,1.9746325 +10X_cells.GGCGACTAGAGGTTGC-L8TX_180221_01_E09,17.025253,2.3897593 +10X_cells.GGAGCAAAGTACTTGC-L8TX_180607_01_C05,14.851124,-3.3681254 +10X_cells.AGAATAGCATTACGAC-L8TX_180221_01_D09,14.443232,1.7256638 +10X_cells.GCTGCTTGTTGGGACA-L8TX_180221_01_C09,13.226914,1.9870648 +10X_cells.AACCGCGCACCAGGCT-L8TX_180221_01_E09,14.483278,-0.8418337 +10X_cells.TTCGGTCCACATGACT-L8TX_180712_01_G05,16.382,2.1274302 +10X_cells.CGTCTACGTAAATGTG-L8TX_180712_01_B06,13.195656,5.351746 +10X_cells.GAACGGATCACTCTTA-L8TX_180712_01_G05,17.489979,4.3030634 +10X_cells.CAAGGCCCAGCATACT-L8TX_180221_01_E09,6.0606003,-3.3904464 +10X_cells.GATGAAAGTATAGTAG-L8TX_180712_01_G05,15.843725,3.7661498 +10X_cells.ATAACGCAGGCAATTA-L8TX_180221_01_E09,14.586968,2.2805362 +10X_cells.GGCGACTAGAATAGGG-L8TX_180221_01_H12,14.659164,-1.4602083 +10X_cells.AGCGTCGGTCGAAAGC-L8TX_180712_01_G05,15.480249,3.4670339 +10X_cells.TCAGCAACAGCTATTG-L8TX_180221_01_E09,15.7469635,1.9032314 +10X_cells.TCAGGTAGTTCGGCAC-L8TX_180712_01_G05,14.849857,3.0244696 +10X_cells.CTAGCCTAGGTAGCTG-L8TX_180221_01_C09,16.21042,-0.2975913 +10X_cells.GGATGTTCAGCATGAG-L8TX_180712_01_G05,15.655036,-2.3154628 +10X_cells.CGAGCACAGTAGATGT-L8TX_180221_01_H12,16.561813,1.8011742 +10X_cells.GAGTCCGGTACCTACA-L8TX_180712_01_B06,16.372555,2.1297545 +10X_cells.GACTGCGGTACCGGCT-L8TX_180607_01_C05,15.814614,-0.17825261 +10X_cells.TGCACCTCAAGCTGGA-L8TX_180221_01_E09,16.47176,1.5235616 +10X_cells.GCTCCTACATCACCCT-L8TX_180712_01_C06,14.773165,3.1369922 +10X_cells.CGTCACTCAGACTCGC-L8TX_180712_01_G05,17.949326,0.5470418 +10X_cells.GATCGATCACGCGAAA-L8TX_180221_01_C09,14.74617,2.4472446 +10X_cells.ACTTGTTGTGATAAAC-L8TX_180712_01_B06,16.138172,2.5716417 +10X_cells.TGAAAGACAATGGAAT-L8TX_180712_01_B06,15.477041,2.9552512 +10X_cells.ATCCACCTCATTATCC-L8TX_180712_01_B06,14.489635,2.328816 +10X_cells.ATCATCTAGTTAGCGG-L8TX_180221_01_D09,14.492579,1.2705607 +10X_cells.CCTCAGTTCGTCGTTC-L8TX_180712_01_C06,14.309916,2.410851 +10X_cells.CCTCAGTAGGACAGCT-L8TX_180221_01_E09,14.653126,-1.197486 +10X_cells.AGCAGCCTCTATGTGG-L8TX_180221_01_C09,14.606619,2.133987 +Smartseq_cells.SM-GE677_S078_E1-50,17.892107,0.61231613 +Smartseq_cells.LS-15012_S01_E1-50,17.687195,-0.49846786 +Smartseq_cells.LS-15013_S04_E1-50,17.75983,0.5342375 +Smartseq_cells.LS-15013_S05_E1-50,17.821901,0.831102 +Smartseq_cells.LS-15013_S06_E1-50,17.290834,0.5220932 +Smartseq_cells.LS-15014_S01_E1-50,17.925894,2.612718 +Smartseq_cells.LS-15014_S24_E1-50,17.094215,-1.0894693 +Smartseq_cells.LS-15023_S35_E1-50,18.429823,3.9492767 +Smartseq_cells.LS-15309_S50_E1-50,16.69909,-2.3756742 +Smartseq_cells.LS-15314_S17_E2-50,18.073503,0.06693047 +Smartseq_cells.LS-15315_S61_E1-50,18.112206,1.7156665 +Smartseq_cells.LS-15315_S80_E1-50,18.069456,0.8186287 +Smartseq_cells.LS-15320_S73_E2-50,17.866463,0.12638454 +Smartseq_cells.LS-15320_S91_E2-50,17.278175,-1.2104846 +Smartseq_cells.LS-15322_S15_E2-50,17.859898,2.7194586 +Smartseq_cells.LS-15325_S78_E2-50,18.196072,0.53581953 +Smartseq_cells.LS-15329_S27_E1-50,18.21408,1.2056813 +Smartseq_cells.LS-15331_S43_E1-50,18.352232,3.7401478 +Smartseq_cells.LS-15341_S03_E1-50,17.687536,-0.39214072 +Smartseq_cells.LS-15342_S58_E1-50,17.511442,-0.8984945 +Smartseq_cells.LS-15345_S15_E1-50,17.686455,-0.7824719 +Smartseq_cells.LS-15345_S74_E1-50,17.833809,0.4037291 +Smartseq_cells.LS-15358_S44_E1-50,18.0557,1.3689909 +Smartseq_cells.LS-15358_S62_E1-50,17.763626,0.55811524 +Smartseq_cells.LS-15376_S87_E1-50,18.05309,4.837002 +Smartseq_cells.LS-15395_S20_E1-50,17.428837,3.3139338 +Smartseq_cells.LS-15398_S55_E1-50,17.705328,-0.29581958 +Smartseq_cells.LS-15398_S69_E1-50,17.559887,-0.8664067 +Smartseq_cells.LS-15499_S61_E1-50,17.900908,3.7834258 +Smartseq_cells.LS-15499_S66_E1-50,17.883123,1.6044148 +Smartseq_cells.LS-15500_S35_E1-50,17.776688,2.6726198 +Smartseq_cells.LS-15500_S50_E1-50,17.971869,0.08192633 +Smartseq_cells.LS-15500_S53_E1-50,17.717451,3.6082218 +Smartseq_cells.SM-D9D9E_S82_E1-50,18.173058,0.61476964 +10X_cells.GAGCAGATCTAACCGA-L8TX_181012_01_G04,15.346153,2.0623887 +10X_cells.CACACAAGTTTACTCT-L8TX_180829_01_D09,17.015217,0.8359773 +10X_cells.CTACACCTCGATAGAA-L8TX_180829_01_D09,13.894305,0.18683812 +10X_cells.CTCGGAGCAGGGTATG-L8TX_180829_01_D09,15.268901,-3.6251943 +10X_cells.GAAGCAGGTGTTCTTT-L8TX_180829_01_D09,13.9564,1.8481579 +10X_cells.GTCGGGTTCTTGTATC-L8TX_180829_01_D09,14.973476,-1.7606199 +10X_cells.GTGCAGCGTGTCGCTG-L8TX_180829_01_D09,14.912362,2.0690577 +10X_cells.GTTACAGAGATACACA-L8TX_180829_01_D09,15.166194,0.9943029 +10X_cells.ACTTACTGTCCAACTA-L8TX_180829_01_D10,5.4334617,-1.973336 +10X_cells.ATTACTCAGACAGGCT-L8TX_180829_01_D10,14.939207,0.32285085 +10X_cells.GCCAAATAGATGGGTC-L8TX_180829_01_D10,14.892683,0.43621245 +10X_cells.GCGACCAAGAATGTGT-L8TX_180829_01_D10,15.466748,-2.136462 +10X_cells.TATGCCCGTCTCTTTA-L8TX_180829_01_D10,14.593959,1.1943667 +10X_cells.TCAGGATAGGCCCTCA-L8TX_180829_01_D10,15.370641,0.8543777 +10X_cells.TGCCCTATCTGGTGTA-L8TX_180829_01_D10,13.700748,3.131588 +10X_cells.GACACGCTCTGGGCCA-L8TX_180829_01_E10,13.939536,1.8655506 +10X_cells.GAGCAGAGTGCACGAA-L8TX_180829_01_E10,15.170974,-0.36358875 +10X_cells.TGTCCCAGTACAGCAG-L8TX_180829_01_E10,15.42874,0.8112462 +10X_cells.AGGTCCGTCAGTCCCT-L8TX_180907_01_F10,14.304925,2.0796683 +10X_cells.TGCTACCAGGGCATGT-L8TX_180907_01_F10,14.683928,2.877352 +10X_cells.AACCGCGCACCAGTTA-L8TX_180907_01_G10,17.47687,-0.4253201 +10X_cells.ATCACGATCCCAGGTG-L8TX_180907_01_G10,15.409257,-0.06162075 +10X_cells.CGATTGAAGGGATACC-L8TX_180907_01_G10,13.821391,1.6098944 +10X_cells.CTCGGAGGTCAGAAGC-L8TX_180907_01_G10,15.287355,1.3720667 +10X_cells.CTTGGCTAGATGTGGC-L8TX_180907_01_G10,14.983909,0.3532471 +10X_cells.AACTGGTTCGTCCAGG-L8TX_181011_01_G02,15.444156,-2.575015 +10X_cells.GAATGAAGTCTAGAGG-L8TX_181011_01_G02,15.633056,0.6987772 +10X_cells.CAGTCCTCAGTAGAGC-L8TX_181011_01_H02,14.8653755,1.2734367 +10X_cells.TAGTGGTCAACTTGAC-L8TX_181011_01_H02,16.736486,-0.122218035 +10X_cells.TGACTAGGTAAATGTG-L8TX_181011_01_H02,16.569647,2.1991005 +10X_cells.CGGAGCTAGAACTGTA-L8TX_181011_01_C04,15.576137,2.1706688 +10X_cells.GACGTGCTCTCGTATT-L8TX_181011_01_C04,15.999713,2.8777492 +10X_cells.AACTCTTCAAGTTAAG-L8TX_181012_01_G04,16.19209,0.14516342 +10X_cells.AGACGTTGTGGTCTCG-L8TX_181012_01_G04,15.096923,-2.2295547 +10X_cells.AGTGTCATCCAGGGCT-L8TX_181012_01_G04,15.273016,0.055790454 +10X_cells.CATCGGGAGTACGATA-L8TX_181012_01_G04,16.027235,2.1761808 +10X_cells.CTTTGCGCATTTGCCC-L8TX_181012_01_G04,16.450338,1.2738508 +10X_cells.GTGTTAGGTAATAGCA-L8TX_181012_01_G04,15.121457,-0.6237643 +10X_cells.TCTGAGAAGAGGTACC-L8TX_181012_01_G04,15.89468,-1.0938983 +10X_cells.TTAGGACTCATTGCCC-L8TX_181012_01_G04,16.189579,-0.18603058 +10X_cells.CAGCCGACAGTCAGAG-L8TX_181012_01_H04,15.696841,1.1227121 +10X_cells.CCTTACGGTAGCGTAG-L8TX_181012_01_H04,16.304565,3.4616563 +10X_cells.CGGTTAAAGTGCCATT-L8TX_181012_01_H04,15.511476,-0.16354844 +10X_cells.GGAACTTAGGCTCTTA-L8TX_181012_01_H04,15.593997,-0.841176 +10X_cells.CAGCTAAAGGGTGTTG-L8TX_181012_01_E05,14.207583,1.9367946 +10X_cells.GACGGCTTCGAATGCT-L8TX_181012_01_E05,17.371485,4.4847054 +10X_cells.GTCATTTCAATGGTCT-L8TX_181012_01_E05,16.517195,3.0146806 +10X_cells.GTGCGGTAGATGTTAG-L8TX_181012_01_E05,16.466013,1.8310238 +10X_cells.TTGACTTGTGACGGTA-L8TX_181012_01_E05,15.184156,-0.22558974 +Smartseq_cells.SM-GE5VH_S269_E1-50,17.44566,1.712993 +10X_cells.TAGAGCTCAAACTGTC-L8TX_180406_01_E02,14.87446,1.514028 +10X_cells.CCGTACTGTAGTGAAT-L8TX_171026_01_B05,16.588707,0.39384642 +10X_cells.CAGCAGCAGAAACCTA-L8TX_171026_01_H03,15.389283,-2.2527661 +10X_cells.TGTCCCAGTTCGCTAA-L8TX_171026_01_G04,17.022366,0.19660112 +10X_cells.ACTGCTCTCTCAAACG-L8TX_171026_01_E05,17.512865,2.0607944 +10X_cells.GGCAATTGTGCTAGCC-L8TX_171026_01_A04,16.640167,-0.72338265 +10X_cells.CACCAGGGTGAGTGAC-L8TX_171026_01_F05,15.555772,-1.2303437 +10X_cells.TAGAGCTGTGCGAAAC-L8TX_171026_01_E05,17.642344,0.55098253 +10X_cells.TTTGTCAGTTCAGTAC-L8TX_171026_01_E05,18.58583,3.7983801 +10X_cells.TACTCATTCGACAGCC-L8TX_171026_01_H03,16.243853,2.2243285 +10X_cells.CGAGCACTCTAACCGA-L8TX_171026_01_F04,16.329168,-0.20595236 +10X_cells.GTAACTGAGAACTCGG-L8TX_171026_01_B05,17.286278,-1.4247739 +10X_cells.AGTTGGTCACTTCTGC-L8TX_171026_01_F03,15.875714,0.7643674 +10X_cells.GACCTGGTCAACACGT-L8TX_171026_01_H04,15.800588,2.6581085 +10X_cells.TGGTTCCTCTAGAGTC-L8TX_171026_01_G04,18.162405,2.152829 +10X_cells.GATGAAATCTACTCAT-L8TX_171026_01_G05,16.76764,-0.6100494 +10X_cells.GTGTGCGAGACGCACA-L8TX_171026_01_B04,18.328093,4.199575 +10X_cells.AAAGTAGAGCGCTCCA-L8TX_171026_01_G03,15.363517,0.22955629 +10X_cells.TAGTGGTGTTACAGAA-L8TX_171026_01_G04,17.923504,2.3805332 +10X_cells.CTGATCCTCAGTCAGT-L8TX_171026_01_G03,16.024912,1.974715 +10X_cells.GTGGGTCAGTGTACCT-L8TX_171026_01_B04,14.843027,0.68734723 +10X_cells.GTGTGCGTCAACACTG-L8TX_171026_01_H03,15.401593,0.27826992 +10X_cells.TTCTTAGAGTGTACGG-L8TX_171026_01_D05,15.700065,1.9677281 +10X_cells.ACGATACGTCTAGTGT-L8TX_171026_01_G04,15.3621235,-0.55409193 +10X_cells.GATGAGGCAGATCGGA-L8TX_171026_01_B05,4.911164,-2.537196 +10X_cells.ATCATCTTCATGCTCC-L8TX_171026_01_H04,13.8385725,0.08952342 +10X_cells.AGGCCACGTGTGTGCC-L8TX_171026_01_E05,13.737619,3.5135407 +10X_cells.CATCGGGTCGGCATCG-L8TX_171026_01_A04,18.241041,3.045832 +10X_cells.ATAAGAGTCAGTGCAT-L8TX_171026_01_A05,15.854946,-0.9717925 +10X_cells.ACACTGATCCGCAGTG-L8TX_171026_01_E05,16.115198,2.0514522 +10X_cells.ATCGAGTTCGCGGATC-L8TX_171026_01_C05,15.244603,-0.6364329 +10X_cells.TGTCCCACATAGAAAC-L8TX_171026_01_A05,17.718437,2.3196285 +10X_cells.GCGCAACGTGTTCTTT-L8TX_171026_01_F03,16.34921,1.2601343 +10X_cells.ACCCACTTCCCAGGTG-L8TX_171026_01_D05,15.614909,2.7513478 +10X_cells.GCATGCGCAGGAACGT-L8TX_171026_01_H03,17.526825,4.442844 +10X_cells.TTAGTTCGTTCAGACT-L8TX_171026_01_F03,15.996134,-2.0615554 +10X_cells.TGGCGCAGTAGCTCCG-L8TX_171026_01_E05,15.340175,-2.1854832 +10X_cells.GAAATGACATTCCTGC-L8TX_171026_01_E05,17.120893,-1.6342385 +10X_cells.CGGCTAGCAACACCCG-L8TX_171026_01_F05,15.970504,0.7306476 +10X_cells.CTGAAACTCTTTACGT-L8TX_171026_01_G04,18.298536,4.574954 +10X_cells.CTCGAAAAGCCTCGTG-L8TX_171026_01_G03,16.661257,0.80783504 +10X_cells.CGGGTCACAACTGGCC-L8TX_171026_01_G04,17.980764,1.8361346 +10X_cells.TGCCAAAGTCTCTTTA-L8TX_171026_01_B05,16.393261,1.6700673 +10X_cells.CCTTCCCTCCGCTGTT-L8TX_171026_01_A04,15.803187,3.4015546 +10X_cells.CAGCCGATCACCACCT-L8TX_171026_01_H05,15.153676,2.9860837 +10X_cells.GTATTCTTCGGATGTT-L8TX_171026_01_A05,16.992216,3.6686502 +10X_cells.CAGAGAGGTAGATTAG-L8TX_171026_01_C05,14.944901,0.9395131 +10X_cells.CTCACACTCTCGTTTA-L8TX_171026_01_H04,15.462254,-3.327858 +10X_cells.AGCTCCTAGGCGCTCT-L8TX_171026_01_C05,17.040537,-0.3269637 +10X_cells.CCTAAAGGTGGTCTCG-L8TX_171026_01_B04,16.034124,3.800242 +10X_cells.GTCTTCGGTTGTGGCC-L8TX_171026_01_F03,17.25345,0.9257087 +10X_cells.GGCAATTGTGTGTGCC-L8TX_171026_01_F05,13.446289,2.3957074 +10X_cells.GTTTCTAGTCATCCCT-L8TX_171026_01_A05,16.70378,0.7382671 +10X_cells.CGTAGGCCATTACCTT-L8TX_171026_01_F03,15.31274,1.8834157 +10X_cells.CTACACCCATCGTCGG-L8TX_171026_01_H03,16.142809,3.0681098 +10X_cells.GATGAAATCACTCTTA-L8TX_171026_01_H05,16.117226,-0.5018633 +10X_cells.AATCGGTCATATACGC-L8TX_171026_01_H03,15.3475275,-2.2476413 +10X_cells.CCTAGCTGTTTCGCTC-L8TX_171026_01_A05,15.245467,-2.4433436 +10X_cells.CTCGGAGGTCTTCGTC-L8TX_171026_01_H03,15.623598,0.75309324 +10X_cells.CGGCTAGTCACATAGC-L8TX_171026_01_F03,15.529529,-2.8002367 +10X_cells.ATTGGACTCGCTAGCG-L8TX_171026_01_H05,16.32103,-2.3110838 +10X_cells.GGTGTTAAGATGTTAG-L8TX_171026_01_A05,14.741455,-3.8606875 +10X_cells.CGGTTAACACCAGGCT-L8TX_171026_01_H03,14.928902,-3.3299565 +10X_cells.CGTGTCTAGCTCCTCT-L8TX_171026_01_H04,14.828811,0.26984236 +Smartseq_cells.LS-15501_S81_E1-50,17.351206,-1.0467138 +Smartseq_cells.LS-15538_S52_E1-50,18.082352,0.319365 +Smartseq_cells.SM-D9EQF_S89_E1-50,18.49918,3.8530257 +Smartseq_cells.SM-DD43R_S09_E1-50,17.562265,3.636871 +Smartseq_cells.SM-DD44L_S19_E1-50,17.107273,-1.0809052 +Smartseq_cells.SM-GE935_S037_E1-50,17.27183,3.9916074 +Smartseq_cells.SM-GE935_S094_E1-50,17.598064,-0.013753073 +Smartseq_cells.SM-GE92H_S018_E1-50,17.634853,-0.19193381 +Smartseq_cells.SM-GE92H_S171_E1-50,16.922451,-1.818276 +Smartseq_cells.SM-GE92H_S230_E1-50,16.035349,-2.8351188 +Smartseq_cells.SM-GE92H_S247_E1-50,16.15456,-2.8101025 +Smartseq_cells.SM-GE92H_S384_E1-50,18.349257,3.7821717 +Smartseq_cells.SM-GE92I_S022_E1-50,15.167012,-4.0063415 +Smartseq_cells.SM-GE92I_S087_E1-50,18.362053,2.7705715 +Smartseq_cells.SM-GE92I_S104_E1-50,16.37627,-2.7076037 +Smartseq_cells.SM-GE92I_S125_E1-50,15.821088,-3.2366316 +Smartseq_cells.SM-GE92I_S132_E1-50,17.84064,0.105301835 +10X_cells.GAACATCAGCCAGAAC-L8TX_181206_01_H11,15.658504,-3.5243843 +10X_cells.GTTCGGGGTGCCTGTG-L8TX_181206_01_H11,15.001861,-2.2876053 +10X_cells.CCGTGGACAGCCACCA-L8TX_181206_01_H11,15.1180725,1.5561181 +10X_cells.GGGATGAGTAGCAAAT-L8TX_181206_01_H11,15.649483,-1.2064744 +10X_cells.GTATTCTGTTATGTGC-L8TX_181206_01_H11,15.539637,0.726692 +10X_cells.ACAGCTAGTCCTCCAT-L8TX_181206_01_A12,15.971812,-0.79359585 +10X_cells.CTCGTCAAGTGAAGTT-L8TX_181206_01_A12,15.155865,0.8576833 +10X_cells.GCGACCAGTCCCTTGT-L8TX_181206_01_A12,14.94483,0.6906872 +10X_cells.TTGTAGGTCCTAGGGC-L8TX_181206_01_A12,15.072678,-1.9181428 +10X_cells.ACGGAGATCAAACCGT-L8TX_181206_01_B12,14.453396,0.90690666 +10X_cells.CAAGTTGCACCACGTG-L8TX_181206_01_B12,15.71985,1.5065012 +10X_cells.CGATCGGAGCGTAGTG-L8TX_181206_01_B12,14.861243,0.07747264 +10X_cells.GATCTAGGTGTTGAGG-L8TX_181206_01_B12,15.359475,-0.3166169 +10X_cells.GTTAAGCCAATGAAAC-L8TX_181206_01_B12,15.0589905,-2.4510467 +10X_cells.TGAGAGGGTACCTACA-L8TX_181206_01_B12,15.20478,-0.30339226 +10X_cells.ACGGAGAGTGCCTTGG-L8TX_181206_01_C12,17.296309,1.2388486 +10X_cells.CAGCCGAAGTTTGCGT-L8TX_181206_01_C12,15.6329155,-0.5664428 +10X_cells.CGTTCTGAGACTGGGT-L8TX_181206_01_C12,15.873855,-0.48289213 +10X_cells.CTGATCCAGGGAAACA-L8TX_181206_01_C12,15.468131,1.4673151 +10X_cells.GTATTCTGTAGTAGTA-L8TX_181206_01_C12,17.642612,1.3363538 +10X_cells.TACCTATAGACTACAA-L8TX_181206_01_C12,16.110083,-0.8224196 +10X_cells.TGGCGCACATTTCACT-L8TX_181206_01_C12,15.552185,-1.0543808 +10X_cells.ACTGAACAGCACCGCT-L8TX_181206_01_D12,15.316625,-1.1387714 +10X_cells.ACTTGTTGTCAAGCGA-L8TX_181206_01_D12,14.83721,-2.8027062 +10X_cells.CAAGAAAAGTTGCAGG-L8TX_181206_01_D12,15.67937,-0.37917578 +10X_cells.CGCTATCTCGGAAACG-L8TX_181206_01_D12,14.936671,0.22918794 +10X_cells.TCTTCGGGTGTTAAGA-L8TX_181206_01_D12,14.785529,1.8548838 +10X_cells.ACAGCTAGTGTTTGGT-L8TX_181206_01_F12,14.57109,-0.5350069 +10X_cells.ACTGATGGTGCCTGTG-L8TX_181206_01_F12,14.4741535,-1.0818247 +10X_cells.ATTGGACGTTGGTAAA-L8TX_181206_01_F12,14.292172,1.2734427 +10X_cells.CAGTAACTCGAATCCA-L8TX_181206_01_F12,14.121066,1.1476088 +10X_cells.GATTCAGGTCGGATCC-L8TX_181206_01_F12,14.501668,-1.5453019 +10X_cells.GGACAAGCAGTTTACG-L8TX_181206_01_F12,15.315554,-0.80000734 +10X_cells.TCGCGAGAGACAATAC-L8TX_181206_01_F12,15.015687,-1.1044264 +10X_cells.TGAGAGGCATGACGGA-L8TX_181206_01_F12,13.855069,1.6473932 +10X_cells.TGGGCGTTCCTTTCGG-L8TX_181206_01_F12,14.88118,0.83559656 +10X_cells.CTCACACCACAAGCCC-L8TX_181206_01_E12,17.497776,-1.0189409 +10X_cells.TCTCTAAAGCACGCCT-L8TX_180406_01_B01,15.995826,2.0215755 +10X_cells.CGTGTCTGTTCCACTC-L8TX_180406_01_B02,14.828684,1.544286 +Smartseq_cells.SM-GE66Z_S366_E1-50,11.274821,-4.006039 +Smartseq_cells.SM-GE671_S253_E1-50,17.405712,1.7839266 +Smartseq_cells.SM-GE8Z8_S013_E1-50,17.893095,2.9035842 +10X_cells.GATTCAGAGCTAGTCT-L8TX_180221_01_F10,14.021548,2.8132257 +10X_cells.GTGCATAGTCCTGCTT-L8TX_180221_01_H10,16.352434,3.9248462 +10X_cells.GAAGCAGTCCTGTACC-L8TX_180221_01_F10,16.085688,3.7802594 +10X_cells.CGTCACTAGCCCGAAA-L8TX_190312_01_G02,17.383375,0.541548 +10X_cells.GTTCTCGCATAGACTC-L8TX_180221_01_A11,14.393504,3.608251 +10X_cells.GTGCGGTAGTGTTGAA-L8TX_180221_01_G10,15.4046955,1.0783985 +10X_cells.GGAACTTTCTGGTATG-L8TX_180221_01_E10,15.843023,2.1365213 +10X_cells.CAGTCCTGTTAAGAAC-L8TX_180221_01_F10,13.988631,2.5844567 +10X_cells.ACTTGTTTCCTCGCAT-L8TX_180221_01_E10,15.1031475,3.4021127 +10X_cells.AGTGAGGTCTCAAGTG-L8TX_180221_01_E10,13.368356,2.989195 +10X_cells.TCAGCTCCACGCTTTC-L8TX_180221_01_D10,15.199359,3.3397748 +10X_cells.CTGGTCTTCACGAAGG-L8TX_180221_01_D10,14.2431555,3.2628667 +10X_cells.CCGTACTCATGGTCAT-L8TX_180221_01_F10,15.900041,-0.6619636 +10X_cells.GTGGGTCGTACGCTGC-L8TX_180221_01_E10,15.252639,-2.5739539 +10X_cells.ATCTACTTCTCGCATC-L8TX_180221_01_F10,16.109482,3.9542253 +10X_cells.CGGGTCATCCACTGGG-L8TX_180221_01_F10,15.714385,4.5885305 +10X_cells.GCGCAGTCAGCATGAG-L8TX_190312_01_D02,14.849045,3.2680905 +10X_cells.GACCAATTCTCCTATA-L8TX_180221_01_H10,17.35384,2.8451896 +10X_cells.CTAGCCTAGCGCTTAT-L8TX_190312_01_G02,13.869698,1.9542407 +10X_cells.TTTGCGCGTGAGGGTT-L8TX_190312_01_C02,17.885326,0.45868626 +10X_cells.CACACAACAGAAGCAC-L8TX_190312_01_C02,17.293556,2.710266 +10X_cells.GTGTGCGAGTTAGGTA-L8TX_180221_01_E10,17.25738,1.3903776 +10X_cells.GGACAAGAGTTCCACA-L8TX_180221_01_D10,13.950378,2.3225002 +10X_cells.CAGCTGGCATCGGGTC-L8TX_180221_01_E10,15.698693,3.9052374 +10X_cells.TAGGCATAGTGTACGG-L8TX_180221_01_G10,15.065052,-0.5303621 +10X_cells.GGACAGAGTAAACACA-L8TX_180221_01_E10,14.662414,1.7374108 +10X_cells.TAGTTGGTCGCTTAGA-L8TX_180221_01_A11,14.703526,2.923131 +10X_cells.GTACTTTGTTGACGTT-L8TX_190312_01_D02,15.194929,3.7921312 +10X_cells.TACTCGCGTGCATCTA-L8TX_190312_01_B02,15.985213,3.749312 +10X_cells.TTTGGTTAGTGGGTTG-L8TX_190312_01_C02,15.398463,2.1686177 +10X_cells.CCTTCCCGTACGACCC-L8TX_180221_01_F10,17.275635,3.5665908 +10X_cells.ATGCGATGTACGCTGC-L8TX_180221_01_H10,14.128886,4.1232214 +10X_cells.CAGCAGCAGGAGTACC-L8TX_180221_01_F10,17.765467,-0.21072935 +10X_cells.TTGGCAAAGGTGGGTT-L8TX_190312_01_C02,17.126982,4.0522346 +10X_cells.GTGAAGGAGACGCAAC-L8TX_190312_01_B02,14.676185,2.1115608 +10X_cells.GTCGTAAAGAGCTTCT-L8TX_180221_01_E10,16.79187,3.3940415 +10X_cells.TCTGGAACAAGTTGTC-L8TX_180221_01_H10,16.952805,-0.27102235 +10X_cells.GCGCCAAAGACAGGCT-L8TX_180221_01_E10,16.07808,2.5651536 +10X_cells.ATCATCTTCACAGGCC-L8TX_180221_01_D10,15.7778425,1.7392682 +10X_cells.TGGGAAGCATCGATGT-L8TX_180221_01_D10,15.567288,3.8156064 +10X_cells.TGCGCAGCAACACGCC-L8TX_180221_01_E10,14.700802,3.5428026 +10X_cells.CAGCGACGTCGCCATG-L8TX_180221_01_G10,14.151184,2.439868 +10X_cells.AGCTCCTTCACAGTAC-L8TX_180221_01_D10,15.807748,3.8048165 +10X_cells.GCGACCACAGATGGGT-L8TX_190312_01_G02,15.385994,2.1810844 +10X_cells.TTTATGCCAGGCTGAA-L8TX_180221_01_G10,17.071077,0.65018034 +10X_cells.GATGCTACAAGGGTCA-L8TX_181012_01_B05,14.86743,-1.4705724 +10X_cells.ACTGAACAGAAGGTGA-L8TX_180907_01_B11,14.575738,1.4725363 +10X_cells.ATCACGAGTCAACATC-L8TX_180907_01_B11,14.874378,3.0104744 +10X_cells.CAAGATCTCACTTACT-L8TX_180907_01_B11,17.597439,2.6360278 +10X_cells.CTACATTTCATAACCG-L8TX_180907_01_B11,14.799014,-1.111827 +10X_cells.CTCTGGTCAGTTAACC-L8TX_180907_01_B11,15.305788,-2.9735894 +10X_cells.GCGAGAAAGGCTAGCA-L8TX_180907_01_B11,17.148018,2.3815985 +10X_cells.TACTCGCTCGTTACGA-L8TX_180907_01_B11,16.208517,0.15595885 +10X_cells.TTATGCTGTAGCCTCG-L8TX_180907_01_B11,16.668127,2.0219986 +10X_cells.ATCTGCCAGATGTGTA-L8TX_180926_01_E12,16.193367,0.99004775 +10X_cells.CACACAAAGGCCCTTG-L8TX_181012_01_B05,16.658682,0.0619301 +10X_cells.CGGGTCAGTACGAAAT-L8TX_181012_01_B05,15.805976,-0.8739299 +10X_cells.CTCAGAAAGATAGGAG-L8TX_181012_01_B05,14.396516,1.4160401 +10X_cells.GAATAAGGTTCCCGAG-L8TX_181012_01_B05,14.53249,-0.77225757 +10X_cells.GTAACGTCACCGCTAG-L8TX_181012_01_B05,14.804891,-0.37000242 +10X_cells.TGACAACAGCCCGAAA-L8TX_181012_01_B05,15.610816,1.1367091 +10X_cells.CAGATCATCATCGATG-L8TX_181012_01_C05,15.567738,0.5860148 +10X_cells.GGATGTTAGTTAGGTA-L8TX_181012_01_C05,15.388414,-1.1154026 +10X_cells.TGAGCATCACCTATCC-L8TX_181012_01_C05,15.639485,1.5438781 +Smartseq_cells.SM-GE95K_S111_E1-50,17.919506,3.3434463 +Smartseq_cells.SM-GE8XN_S289_E1-50,17.632626,1.6453323 +10X_cells.ACCTTTATCTTTCCTC-L8TX_180221_01_B11,14.257168,1.4953487 +10X_cells.CCTTCCCCAACACGCC-L8TX_180221_01_B11,13.997501,0.5473163 +10X_cells.CGATCGGTCCGCAGTG-L8TX_180221_01_B11,16.176403,2.1766715 +10X_cells.GACGTTATCGTCTGCT-L8TX_180221_01_B11,13.924481,1.2914703 +10X_cells.GCTTGAAAGCCCAACC-L8TX_180221_01_B11,13.930408,-1.5179244 +10X_cells.AAAGTAGAGGTGATAT-L8TX_180221_01_C11,17.160074,1.4579788 +10X_cells.CTTAGGAGTACTTCTT-L8TX_180221_01_C11,15.365407,-2.4656267 +10X_cells.TGGGCGTCATGACATC-L8TX_180221_01_C11,16.375998,0.29950768 +10X_cells.CACAAACCACATCCAA-L8TX_180221_01_D11,14.183254,-0.59381455 +10X_cells.CACACCTAGTTTGCGT-L8TX_180221_01_D11,15.7437525,1.9844276 +10X_cells.CACAGTATCTCATTCA-L8TX_180221_01_D11,15.186333,0.73339194 +10X_cells.CCGTACTGTGTGAATA-L8TX_180221_01_D11,14.101274,1.2552567 +10X_cells.CGTTAGATCACCGTAA-L8TX_180221_01_D11,14.709683,0.2139939 +10X_cells.CTTGGCTAGAGTACAT-L8TX_180221_01_D11,13.63241,-1.4575782 +10X_cells.GATGAAACACCAGGCT-L8TX_180221_01_D11,15.98906,-1.3426684 +10X_cells.GGTGCGTAGTCGTTTG-L8TX_180221_01_D11,13.568518,-0.5925134 +10X_cells.TAAGAGAGTAGGCATG-L8TX_180221_01_D11,14.408884,-0.5200887 +10X_cells.TTAGTTCGTAAGTAGT-L8TX_180221_01_D11,14.088014,0.77025557 +10X_cells.CGAACATTCCTTCAAT-L8TX_180221_01_E11,13.967431,1.738228 +10X_cells.CCTATTATCACATACG-L8TX_180221_01_F11,15.304649,-2.3659837 +10X_cells.TAGTTGGTCGTACGGC-L8TX_180221_01_F11,17.266417,2.6793928 +10X_cells.TGGTTAGAGCTGATAA-L8TX_180221_01_F11,14.08971,0.8286388 +10X_cells.CCACTACCAATGGAGC-L8TX_180221_01_G11,16.3778,3.036651 +10X_cells.CCTACCAAGTCCAGGA-L8TX_180221_01_G11,16.74796,1.4254282 +10X_cells.GCATACAGTAGCGCTC-L8TX_180221_01_G11,15.087809,2.396801 +10X_cells.GTGAAGGTCTAGCACA-L8TX_180221_01_G11,17.831446,4.301729 +10X_cells.GTTCGGGGTCAGGACA-L8TX_180221_01_G11,15.68214,0.80308485 +10X_cells.GGGCATCGTAAGCACG-L8TX_190312_01_E02,17.714998,0.70844024 +10X_cells.CACAGGCAGAAGGTGA-L8TX_190312_01_F02,17.771023,3.2013533 +10X_cells.CCACCTACATGCTAGT-L8TX_190312_01_H02,15.79281,3.7906764 +Smartseq_cells.SM-GE67O_S350_E1-50,17.155983,-1.6447911 +10X_cells.TGCCCATAGTTCGCGC-L8TX_180907_01_H11,15.45979,1.6053267 +10X_cells.TAGCCGGTCGTCCGTT-L8TX_180907_01_G11,16.82827,2.2859054 +10X_cells.AGGCCGTCATAGTAAG-L8TX_180907_01_H11,14.998431,-0.4350172 +10X_cells.GACCAATGTGCAACTT-L8TX_180907_01_H11,15.927381,0.7830146 +10X_cells.TGGGCGTAGCTTATCG-L8TX_180907_01_H11,14.812878,0.72963536 +10X_cells.AAACCTGGTAGCGCAA-L8TX_180907_01_A12,15.821022,-2.0162008 +10X_cells.TGCACCTGTTACCAGT-L8TX_180907_01_A12,15.7886915,0.85949314 +10X_cells.TTCTACAGTAGGGACT-L8TX_180907_01_A12,14.8525,-3.8851924 +10X_cells.ACTGATGGTTGGGACA-L8TX_180907_01_B12,15.589442,-1.68154 +10X_cells.AGTGGGAAGGCAAAGA-L8TX_180907_01_B12,15.0125675,-3.223557 +10X_cells.CATGCCTAGCTAACTC-L8TX_180907_01_B12,16.704342,1.9327772 +10X_cells.ACGGCCAGTTAAGACA-L8TX_180907_01_E11,16.277874,-2.9607387 +10X_cells.ATCACGATCACAACGT-L8TX_180907_01_E11,14.562518,0.8290251 +10X_cells.TACACGATCCTATTCA-L8TX_180907_01_E11,14.850729,-1.1523649 +10X_cells.TGCCAAAAGATCCGAG-L8TX_180907_01_E11,13.617119,-0.032983392 +10X_cells.TTGGCAATCTTCTGGC-L8TX_180907_01_E11,13.913546,0.002759395 +10X_cells.CTCAGAACAAACGTGG-L8TX_190312_01_D01,15.624115,0.73926896 +Smartseq_cells.LS-15501_S67_E1-50,17.423191,-1.061825 +Smartseq_cells.LS-15501_S69_E1-50,18.191385,2.0139406 +Smartseq_cells.SM-DD43Q_S20_E1-50,17.1112,3.9022288 +Smartseq_cells.SM-DD443_S26_E1-50,17.726826,0.000796407 +Smartseq_cells.SM-DD44A_S56_E1-50,17.912455,3.4314418 +Smartseq_cells.SM-GE5UR_S104_E1-50,18.099543,2.883512 +Smartseq_cells.SM-GE5UR_S307_E1-50,16.789938,-2.2418292 +Smartseq_cells.SM-GE5US_S302_E1-50,17.678015,1.8353863 +Smartseq_cells.SM-GE5UT_S247_E1-50,18.242393,3.7430222 +10X_cells.GTGTTAGTCAGTCCCT-L8TX_180926_01_F01,16.690998,4.2887692 +10X_cells.AAAGCAAGTTTACTCT-L8TX_180926_01_E01,16.474459,1.7269329 +10X_cells.AGGGATGTCCCAACGG-L8TX_180926_01_B01,14.881522,2.3213437 +10X_cells.CATTCGCCATCGATTG-L8TX_180926_01_B01,14.351998,3.0969381 +10X_cells.GCCAAATAGACTAGGC-L8TX_180926_01_B01,5.045251,-2.169351 +10X_cells.CCTACCAAGGGCATGT-L8TX_180926_01_D01,15.1844015,1.2813137 +10X_cells.GCTCCTAAGACGACGT-L8TX_180926_01_D01,13.545229,3.206052 +10X_cells.TACCTTAAGAAAGTGG-L8TX_180926_01_D01,15.016214,-2.8216264 +10X_cells.TTTACTGCATTGAGCT-L8TX_180926_01_D01,17.083021,3.1366978 +10X_cells.GCACTCTCATATGCTG-L8TX_180926_01_F01,17.25465,-0.106547035 +10X_cells.CACAGGCAGCAATCTC-L8TX_181011_01_B03,15.75096,3.8420963 +10X_cells.CCCAATCAGTGTCCCG-L8TX_181011_01_B03,13.014805,2.4176004 +10X_cells.GAATGAAAGTACGTAA-L8TX_181011_01_B03,13.902474,2.8576972 +10X_cells.GAGCAGACAATACGCT-L8TX_181011_01_C03,14.760913,2.1089785 +10X_cells.GCTTGAACACAGACAG-L8TX_181011_01_C03,16.545694,-0.18218051 +10X_cells.AGTTGGTTCACGAAGG-L8TX_181011_01_H03,15.032426,2.8842137 +10X_cells.CCACCTAGTAATTGGA-L8TX_181011_01_H03,15.853639,3.4370105 +Smartseq_cells.SM-GE914_S374_E1-50,18.07766,1.5973525 +10X_cells.ACTTGTTGTAACGCGA-L8TX_180221_01_C12,14.454896,2.511382 +10X_cells.AAGTCTGTCTTGAGGT-L8TX_180712_01_E05,14.7346325,2.7812755 +10X_cells.CCTTTCTGTTGAACTC-L8TX_180712_01_E05,14.437782,2.5550513 +10X_cells.GTGGGTCCATGCTGGC-L8TX_180712_01_E05,16.386482,1.4032319 +10X_cells.CATTCGCAGACGCACA-L8TX_180712_01_F05,16.670532,1.1094517 +10X_cells.TTAGGACAGCTAGCCC-L8TX_180712_01_F05,15.325816,0.26392308 +10X_cells.AAGCCGCCAGACAGGT-L8TX_180712_01_H05,16.115873,2.8787618 +10X_cells.ACATGGTGTCTGCGGT-L8TX_180712_01_H05,15.168544,2.4737613 +10X_cells.ATCATCTTCGGCGGTT-L8TX_180712_01_H05,16.405773,2.4160352 +10X_cells.GTAGGCCTCCTAAGTG-L8TX_180712_01_H05,16.435698,-1.3029482 +10X_cells.ACGCAGCGTGTATGGG-L8TX_180712_01_A06,16.324196,2.2716885 +10X_cells.AGCGGTCGTTGTACAC-L8TX_180712_01_A06,16.445574,2.1106923 +10X_cells.AGTGTCACACAGATTC-L8TX_180712_01_A06,16.568256,2.1808124 +10X_cells.CGAGCACCACGCGAAA-L8TX_180712_01_A06,16.182728,2.4243329 +10X_cells.CTCGGGAAGTCTCCTC-L8TX_180712_01_A06,16.262978,2.0707307 +10X_cells.GCGCAACGTGACAAAT-L8TX_180712_01_A06,14.726318,3.7761734 +10X_cells.GGCGACTGTCTAACGT-L8TX_180712_01_A06,16.670666,0.4513485 +10X_cells.GGGCACTTCGTGGTCG-L8TX_180712_01_A06,16.472914,1.7006121 +10X_cells.TGAGCCGCATAACCTG-L8TX_180712_01_A06,14.854531,2.9569776 +10X_cells.CAGTAACGTGTGCCTG-L8TX_180504_01_E01,15.011492,3.6981788 +10X_cells.CATCGGGCAGCAGTTT-L8TX_180504_01_E01,15.464987,3.1340017 +10X_cells.GACGCGTGTCTGCGGT-L8TX_180504_01_E01,13.784477,1.4453542 +10X_cells.GCCTCTATCGCAAACT-L8TX_180504_01_E01,17.212624,3.8234537 +10X_cells.GCGCAGTGTAGGGACT-L8TX_180504_01_E01,15.627291,3.0785904 +10X_cells.GGATGTTAGTCAAGCG-L8TX_180504_01_E01,15.929014,4.194859 +10X_cells.TGCCCATCACATGTGT-L8TX_180504_01_E01,16.042288,0.456429 +10X_cells.TGGACGCCATATACCG-L8TX_180504_01_E01,14.856662,3.5714068 +10X_cells.AGCTTGATCGTCACGG-L8TX_180221_01_A12,13.771699,2.574588 +10X_cells.GTTCATTAGGAGCGAG-L8TX_180221_01_A12,13.932695,1.9294761 +10X_cells.CGATGGCGTGGTAACG-L8TX_180221_01_B12,14.027158,1.7937752 +10X_cells.TGTCCCAAGATGGCGT-L8TX_180221_01_B12,15.017198,-1.5830886 +10X_cells.ACGGGCTTCTGATTCT-L8TX_180221_01_C12,14.045455,-0.2490808 +10X_cells.AGCTTGACACATCCGG-L8TX_180221_01_C12,16.693033,0.5303721 +10X_cells.AGGTCCGGTCACTTCC-L8TX_180221_01_C12,13.159696,2.4225833 +10X_cells.AGTGTCAGTTGGTGGA-L8TX_180221_01_C12,14.11775,2.1529608 +10X_cells.CGTTCTGTCAGTGCAT-L8TX_180221_01_C12,14.61537,2.5330954 +10X_cells.CTCGAGGTCGCCTGAG-L8TX_180221_01_C12,14.373024,2.53742 +10X_cells.TAAACCGGTGATGTCT-L8TX_180221_01_C12,15.549205,0.22277108 +10X_cells.ACATGGTGTTCAACCA-L8TX_180221_01_D12,13.423243,3.1681254 +10X_cells.CGTTAGATCAACGGCC-L8TX_180221_01_D12,14.27568,3.2056236 +10X_cells.GCGGGTTTCTACTCAT-L8TX_180221_01_D12,14.544257,-1.2130004 +10X_cells.TTCGGTCAGACCCACC-L8TX_180221_01_D12,14.819887,2.9214282 +10X_cells.TTGCCGTCAACTGCGC-L8TX_180221_01_D12,14.784439,1.9343791 +10X_cells.GTACTCCAGCAAATCA-L8TX_180221_01_H11,14.108796,0.5544204 +10X_cells.AGCTCCTTCCCTTGTG-L8TX_200611_02_A05,16.004955,4.3730235 +10X_cells.CCTTTCTAGGCGACAT-L8TX_200611_02_A05,14.469257,3.8885484 +10X_cells.GTGCATAGTCACCTAA-L8TX_200611_02_A05,16.002253,3.4664524 +10X_cells.CATCAAGCAAGCTGAG-L8TX_180115_01_B11,16.407574,2.677041 +10X_cells.AGCTTGAGTAGCGTCC-L8TX_180115_01_A09,15.459703,1.4424357 +10X_cells.GGTGTTAAGGAATCGC-L8TX_180115_01_E11,13.829114,1.6104063 +10X_cells.CTCATTAGTGCGCTTG-L8TX_180115_01_F09,14.608192,-0.5722553 +10X_cells.CTGAAACCAGCCAATT-L8TX_180115_01_E11,14.964082,1.038735 +10X_cells.GGTGTTATCGGATGTT-L8TX_180115_01_H11,16.375208,3.5755608 +10X_cells.CGCTGGAAGGATGGTC-L8TX_180115_01_G10,14.651521,1.0046624 +10X_cells.ACACCGGCACAGACAG-L8TX_180115_01_A11,16.091665,2.1705973 +10X_cells.CTTCTCTGTCCGCTGA-L8TX_180115_01_D11,17.18271,4.949007 +10X_cells.GGACATTCAGGTTTCA-L8TX_180115_01_G11,16.015978,1.679468 +10X_cells.GTTCTCGGTCCGAATT-L8TX_180115_01_A11,17.346613,1.7292476 +10X_cells.TGACTAGCATAAGACA-L8TX_180115_01_E11,16.498625,2.5064306 +10X_cells.AACTTTCCACATTCGA-L8TX_180115_01_C11,16.99199,2.1904807 +10X_cells.ATCGAGTCAGGGTATG-L8TX_180115_01_H11,16.773129,1.7220227 +10X_cells.AACTCTTCAACACGCC-L8TX_180115_01_A11,15.79121,-1.7532357 +10X_cells.GACGTGCGTAGTGAAT-L8TX_180115_01_B10,15.242228,0.79350704 +10X_cells.CGACCTTCACCATGTA-L8TX_180115_01_E10,15.562124,1.5150433 +10X_cells.ATTATCCCAAGTAGTA-L8TX_180115_01_B11,14.187133,-1.5724095 +10X_cells.CAAGAAACAGTCGATT-L8TX_180115_01_E10,15.092512,-0.3863394 +10X_cells.CATGACATCATGTCTT-L8TX_180115_01_H11,16.960209,1.9446268 +10X_cells.GACACGCGTTGTGGCC-L8TX_180115_01_A09,15.495159,2.2115917 +10X_cells.CGCTTCAAGATCTGAA-L8TX_180115_01_B11,14.464411,1.7867374 +10X_cells.GACAGAGTCACTGGGC-L8TX_180115_01_C11,16.235903,-0.96995836 +10X_cells.GCTTCCACACCTCGTT-L8TX_180115_01_D09,14.912055,1.2808524 +10X_cells.TTGCCGTGTGGGTATG-L8TX_180115_01_H10,14.43519,-1.3965999 +10X_cells.ATCTACTCACAGTCGC-L8TX_180115_01_A11,14.915988,-2.2794466 +10X_cells.AGGCCACCAGATGAGC-L8TX_180115_01_A09,16.235325,-0.70643854 +10X_cells.TACGGGCGTAGGGACT-L8TX_180115_01_H11,17.21805,-0.62174785 +10X_cells.AGTTGGTAGCTAACTC-L8TX_180115_01_E11,16.268204,-1.7301767 +10X_cells.GAGTCCGCATACTCTT-L8TX_180115_01_H10,14.853706,-0.4066474 +10X_cells.AAGGAGCCACTGTTAG-L8TX_180115_01_F09,15.173956,0.79812604 +10X_cells.CGATCGGAGACCCACC-L8TX_180115_01_C11,15.283131,-2.375794 +10X_cells.CGACTTCAGCCTCGTG-L8TX_180115_01_B10,14.757726,-0.26252818 +10X_cells.TATCAGGCACAACTGT-L8TX_180115_01_B11,16.128529,2.0526323 +10X_cells.GACCAATTCTAACCGA-L8TX_180115_01_C10,15.72204,1.5754526 +10X_cells.AGGGAGTCACGCGAAA-L8TX_180115_01_F10,16.44556,2.850449 +10X_cells.TCGGTAACAGGTCCAC-L8TX_180115_01_B11,16.08812,-0.36499533 +10X_cells.CGTCCATTCACCCGAG-L8TX_180115_01_E09,14.818459,0.47148246 +10X_cells.CGTCCATTCGCCTGAG-L8TX_180115_01_C11,17.45335,0.10001951 +10X_cells.TGGCGCACAGAGCCAA-L8TX_180115_01_B10,15.287477,-2.2827785 +Smartseq_cells.SM-GE5PB_S061_E1-50,17.481415,3.597193 +Smartseq_cells.SM-GE5PE_S229_E1-50,15.9918165,-3.1584547 +10X_cells.AAATGCCGTTACGCGC-L8TX_171120_01_G07,16.914072,4.101942 +10X_cells.AACTGGTGTCAGAAGC-L8TX_171120_01_G07,17.91618,3.1560311 +10X_cells.ACACCAAAGGACATTA-L8TX_171120_01_G07,17.748108,4.069897 +10X_cells.ACATACGAGAAGGGTA-L8TX_171120_01_G07,16.895897,1.9553758 +10X_cells.CCAATCCAGGGCACTA-L8TX_171120_01_G07,16.128063,-2.7482119 +10X_cells.CCGTGGATCTGATTCT-L8TX_171120_01_G07,17.567204,-0.7906745 +10X_cells.CGCTGGAGTTCCGGCA-L8TX_171120_01_G07,15.290594,1.5575094 +10X_cells.CTAAGACCACTCTGTC-L8TX_171120_01_G07,15.769455,-3.5808861 +10X_cells.GCTCCTAAGATAGGAG-L8TX_171120_01_G07,17.3229,3.1359022 +10X_cells.TCATTACGTTGGAGGT-L8TX_171120_01_G07,17.084192,-1.4134561 +10X_cells.TCTGAGATCGTCCGTT-L8TX_171120_01_G07,16.020449,-2.4710734 +10X_cells.AAAGATGAGGTCATCT-L8TX_171120_01_H07,15.139604,-2.3214345 +10X_cells.AGTTGGTAGTCCAGGA-L8TX_171120_01_H07,16.849989,-1.8048958 +10X_cells.CGTCCATGTGCCTTGG-L8TX_171120_01_H07,17.682451,1.5608221 +10X_cells.GTCGGGTTCTGTCAAG-L8TX_171120_01_H07,14.892195,2.505575 +10X_cells.CATCAGACAGGTCCAC-L8TX_180115_01_G08,17.290651,-0.96915495 +10X_cells.CCACTACAGGCGATAC-L8TX_180115_01_G08,16.979801,0.43052447 +10X_cells.GCCTCTAGTGCCTTGG-L8TX_180115_01_G08,14.676936,-1.5472718 +10X_cells.GGAACTTGTCGCTTTC-L8TX_180115_01_G08,18.222813,3.44938 +10X_cells.GTGGGTCCATTCGACA-L8TX_180115_01_G08,15.036177,-3.9797716 +10X_cells.TACTCGCTCATCGATG-L8TX_180115_01_G08,15.590023,-3.1470451 +10X_cells.CAGAATCAGTTCGCGC-L8TX_171120_01_C07,15.316439,0.3194821 +10X_cells.AACTCAGAGCACGCCT-L8TX_171120_01_D07,16.155495,3.46693 +10X_cells.ACCTTTATCACTTATC-L8TX_171120_01_C07,16.647068,3.4913745 +10X_cells.CGGACACCATCTATGG-L8TX_171120_01_C07,15.084642,-1.9527574 +10X_cells.CTGTTTAGTTCGGCAC-L8TX_171120_01_C07,15.232189,-0.84920037 +10X_cells.GTGCTTCTCTTGAGAC-L8TX_171120_01_C07,17.36717,-1.457505 +10X_cells.GACCAATAGCCCAGCT-L8TX_180115_01_H08,16.87852,-1.9948422 +10X_cells.GTACTCCAGGAGTTGC-L8TX_180115_01_H08,14.313151,-4.2078977 +10X_cells.GTGCTTCTCGCACTCT-L8TX_180115_01_H08,16.696672,1.2031697 +10X_cells.CATTCGCGTGCTAGCC-L8TX_180115_01_D08,18.095087,2.906496 +10X_cells.GACAGAGGTGGTGTAG-L8TX_180115_01_D08,17.597652,2.9077885 +10X_cells.GGACAAGTCGCCAGCA-L8TX_180115_01_D08,16.900436,-0.91625166 +10X_cells.CATATGGGTGCACCAC-L8TX_171120_01_D07,16.519361,3.7573757 +10X_cells.CATCCACTCTGCGGCA-L8TX_171120_01_D07,15.139814,-2.4494405 +10X_cells.TCATTTGTCACATGCA-L8TX_171120_01_D07,14.840111,-0.39416695 +10X_cells.TGAGCCGTCAGCTCTC-L8TX_171120_01_D07,16.576557,0.635664 +10X_cells.TGCTACCGTACTTGAC-L8TX_171120_01_D07,16.92343,-0.70256126 +10X_cells.TTGGCAACAGGACGTA-L8TX_171120_01_D07,15.646196,1.4156888 +10X_cells.CGACTTCAGCAATATG-L8TX_171120_01_E07,15.842983,4.29596 +10X_cells.CTTGGCTAGTACGCGA-L8TX_180115_01_E08,17.316217,-1.4180597 +10X_cells.GTGAAGGCATCAGTAC-L8TX_171120_01_E07,16.949017,-1.0067344 +10X_cells.AACTCAGGTCTTCGTC-L8TX_171120_01_E07,15.580504,-1.5658547 +10X_cells.ACCGTAAGTAATCGTC-L8TX_171120_01_E07,15.234848,1.3102943 +10X_cells.AGAGTGGCATCCTAGA-L8TX_171120_01_E07,15.913422,1.951878 +10X_cells.AGTCTTTCACTGTTAG-L8TX_171120_01_E07,16.452175,2.8371248 +10X_cells.ATAACGCGTGTTTGGT-L8TX_171120_01_E07,15.133168,-3.00254 +10X_cells.ATGGGAGGTGGACGAT-L8TX_171120_01_E07,16.780949,2.0828533 +10X_cells.CCGGTAGTCGGATGGA-L8TX_171120_01_E07,17.09023,2.6795564 +10X_cells.CTAGAGTAGACATAAC-L8TX_171120_01_E07,17.686193,3.2671008 +10X_cells.GGACAGACACATCCGG-L8TX_171120_01_E07,16.737154,-0.1910439 +10X_cells.GGAGCAACACAGACAG-L8TX_171120_01_E07,13.205585,2.580083 +10X_cells.CACACAATCATTGCCC-L8TX_171120_01_F07,17.30207,-0.0810897 +10X_cells.CGTAGGCCACGGATAG-L8TX_171120_01_F07,17.649416,-0.13838443 +10X_cells.CTTTGCGAGATACACA-L8TX_171120_01_F07,15.2044735,-1.8143384 +10X_cells.GAAGCAGAGCCAGTAG-L8TX_171120_01_F07,17.489183,2.1774354 +10X_cells.GTACTTTAGTTCGCGC-L8TX_171120_01_F07,14.657861,-0.56577826 +10X_cells.TTCGAAGAGCGTCAAG-L8TX_171120_01_F07,14.359136,-0.8281543 +10X_cells.TCAGGATCACCAGATT-L8TX_180115_01_F08,17.334097,1.2003925 +10X_cells.CATCCACCACGGTGTC-L8TX_180115_01_C08,15.986447,-1.9014987 +10X_cells.ACAGCTATCCACGCAG-L8TX_180115_01_E08,16.63663,-1.9867336 +10X_cells.CGGACGTGTCACTGGC-L8TX_180115_01_E08,15.746025,-2.8554604 +10X_cells.CTGAAGTGTCACTGGC-L8TX_180115_01_E08,16.172653,2.7298176 +10X_cells.TTTCCTCCAGCTCGAC-L8TX_180115_01_E08,16.448011,3.9071093 +Smartseq_cells.LS-15008_S43_E1-50,15.8525305,-3.6035528 +Smartseq_cells.LS-15049_S76_E1-50,16.062422,-3.2699308 +Smartseq_cells.LS-15068_S64_E1-50,18.135035,3.4838603 +Smartseq_cells.LS-15069_S83_E1-50,18.17298,1.3492494 +Smartseq_cells.LS-15074_S10_E1-50,18.017422,-0.040125966 +Smartseq_cells.LS-15075_S17_E1-50,16.6964,-2.0434263 +Smartseq_cells.LS-15076_S85_E1-50,18.355223,3.822763 +Smartseq_cells.LS-15077_S45_E1-50,17.652678,1.5240395 +Smartseq_cells.LS-15078_S27_E1-50,15.44551,-3.8865817 +Smartseq_cells.LS-15078_S30_E1-50,15.791176,-3.0268695 +Smartseq_cells.LS-15096_S16_E1-50,15.581349,-3.5545766 +Smartseq_cells.LS-15347_S94_E1-50,18.106148,0.37109828 +Smartseq_cells.LS-15347_S95_E1-50,16.362562,-3.101709 +Smartseq_cells.LS-15348_S85_E1-50,17.312963,-1.2267721 +Smartseq_cells.LS-15348_S87_E1-50,18.177872,0.43850583 +Smartseq_cells.LS-15348_S88_E1-50,15.8251505,-3.5832124 +Smartseq_cells.LS-15353_S37_E1-50,16.320097,-3.0281963 +Smartseq_cells.LS-15353_S81_E1-50,16.679514,-2.4424212 +Smartseq_cells.LS-15576_S86_E1-50,17.803968,4.789813 +Smartseq_cells.LS-15580_S07_E1-50,16.68564,-2.5200055 +Smartseq_cells.LS-15580_S24_E1-50,17.963068,1.8813213 +Smartseq_cells.SM-D9EP5_S89_E1-50,17.65814,3.3335893 +Smartseq_cells.SM-D9EP5_S94_E1-50,18.289959,1.7459985 +Smartseq_cells.SM-D9CXP_S44_E1-50,18.082926,2.1598582 +Smartseq_cells.SM-D9CXQ_S13_E1-50,17.336205,-1.585106 +Smartseq_cells.SM-D9CXY_S24_E1-50,16.045498,-3.1447315 +Smartseq_cells.SM-DD45I_S003_E1-50,17.58376,0.9019534 +Smartseq_cells.SM-DD45K_S118_E1-50,17.257954,-1.3451091 +Smartseq_cells.SM-DD45K_S121_E1-50,17.347431,-1.0087616 +Smartseq_cells.SM-DD45K_S174_E1-50,16.58717,-1.9457537 +Smartseq_cells.SM-DD45L_S074_E1-50,17.13798,-1.0537951 +Smartseq_cells.SM-GE635_S033_E1-50,17.36979,3.73897 +Smartseq_cells.SM-GE635_S084_E1-50,16.309013,-3.0767543 +Smartseq_cells.SM-GE635_S181_E1-50,18.223434,2.9571488 +Smartseq_cells.SM-GE631_S024_E1-50,18.280008,1.2898673 +Smartseq_cells.SM-GE676_S062_E1-50,15.391664,-3.8109422 +Smartseq_cells.SM-GE67T_S062_E1-50,17.758646,1.7621574 +Smartseq_cells.SM-GE8ZW_S253_E1-50,17.957016,0.06425884 +Smartseq_cells.SM-GE94L_S086_E1-50,18.281317,2.8102024 +Smartseq_cells.SM-GE94L_S175_E1-50,15.739501,-3.6419394 +Smartseq_cells.SM-GE94L_S262_E1-50,17.875101,3.6077619 +Smartseq_cells.SM-GE94L_S330_E1-50,14.865149,-4.001556 +Smartseq_cells.SM-GE94L_S336_E1-50,18.179762,2.6661675 +Smartseq_cells.SM-GE94L_S354_E1-50,14.782436,-4.257403 +10X_cells.CGATCGGGTCACACGC-L8TX_180221_01_C10,-0.14047447,-3.7314246 +10X_cells.CACACCTCAGCGAACA-L8TX_180221_01_F09,-0.6974592,-3.8793085 +10X_cells.TGTCCCACAGGCTCAC-L8TX_180221_01_G09,-1.5871185,-3.9465067 +10X_cells.AGCAGCCTCCTTCAAT-L8TX_180221_01_C10,-0.48854417,-2.9374897 +10X_cells.TACAGTGGTCATGCAT-L8TX_180221_01_C10,-1.4730175,-3.9268205 +10X_cells.AGGTCCGCACCAGGCT-L8TX_180406_01_F02,-0.9515746,-2.7049487 +10X_cells.GCACTCTAGTTAGCGG-L8TX_180406_01_C06,6.378435,-3.4362643 +Smartseq_cells.SM-GE63L_S164_E1-50,-0.14959623,-2.2811275 +10X_cells.CGTGTAAAGGACCACA-L8TX_180221_01_E09,10.09671,-4.0091367 +10X_cells.TCATTTGGTTACTGAC-L8TX_180221_01_C09,-0.45422298,-1.9378786 +10X_cells.AAAGATGCATTTCACT-L8TX_180221_01_D09,-1.0380528,-1.6178708 +10X_cells.ACGAGCCGTAGTAGTA-L8TX_180712_01_G05,-1.3594459,-4.13447 +10X_cells.GGACAGATCAACACTG-L8TX_180712_01_G05,6.881562,-2.5350192 +10X_cells.TGGCGCACAGCTCGAC-L8TX_180712_01_G05,1.3869947,-2.957614 +Smartseq_cells.LS-15313_S34_E2-50,-0.120097786,-4.052553 +Smartseq_cells.LS-15374_S93_E1-50,-1.8425752,-3.4015868 +Smartseq_cells.LS-15376_S96_E1-50,-0.9222075,-3.7854815 +Smartseq_cells.LS-15500_S42_E1-50,-0.09030729,-4.20285 +10X_cells.TACTTACGTGTCCTCT-L8TX_181012_01_E05,1.0397047,-3.437163 +10X_cells.GAATAAGAGTGGACGT-L8TX_181012_01_H04,1.0947859,-2.935389 +10X_cells.AGAATAGGTAACGTTC-L8TX_180829_01_D10,-0.12504396,-3.318198 +10X_cells.TAGTTGGCACTGTCGG-L8TX_180829_01_D10,1.6154717,-2.4250414 +10X_cells.AACCATGGTACTCGCG-L8TX_181011_01_H02,11.623633,-2.0839303 +10X_cells.CAGTAACCAGCTGCAC-L8TX_181011_01_H02,-0.091183715,-3.0637422 +10X_cells.CGATGTAGTATATGAG-L8TX_181011_01_H02,-1.0354711,-4.171758 +10X_cells.CAACTAGGTGCTGTAT-L8TX_181012_01_E05,0.19177045,-2.2490847 +10X_cells.CCATGTCTCTATCCTA-L8TX_181012_01_E05,-0.3902406,-2.2152715 +10X_cells.GAGGTGATCCTGCTTG-L8TX_180406_01_E02,-0.03220119,-1.3839499 +10X_cells.TGCACCTCATGCTAGT-L8TX_180406_01_E02,0.4775926,-1.8651533 +10X_cells.TGACTAGCAAGGTTTC-L8TX_180406_01_H02,-0.1167644,-1.8450826 +10X_cells.TACCTTAAGTGAATTG-L8TX_180406_01_B06,0.75919247,-0.36489215 +Smartseq_cells.SM-GE91G_S298_E1-50,0.18395953,-2.9637406 +10X_cells.TTTCCTCAGGACACCA-L8TX_171026_01_A05,0.54181516,-3.6843455 +10X_cells.CGTCTACAGATGGGTC-L8TX_171026_01_A05,-0.5040755,-3.9674006 +10X_cells.ATTACTCTCTAACTGG-L8TX_171026_01_B04,-1.6919024,-3.7401214 +10X_cells.GGATGTTAGTCGTTTG-L8TX_171026_01_E05,-0.8104206,-3.0705035 +10X_cells.TGTGGTACAGATCCAT-L8TX_171026_01_F03,-1.0179965,-3.470851 +10X_cells.CTTAACTGTCTAGTGT-L8TX_171026_01_G03,-1.3129454,-4.0488777 +10X_cells.TCTATTGAGTCAAGCG-L8TX_171026_01_F04,-0.702418,-3.065919 +10X_cells.CTCTACGAGATCGGGT-L8TX_171026_01_G04,-1.850954,-3.7239833 +10X_cells.TGAGGGAAGACACGAC-L8TX_171026_01_G04,-0.18197541,-4.2071447 +10X_cells.CCCAATCGTGTAACGG-L8TX_171026_01_H04,-1.3652112,-2.2932653 +10X_cells.TGAGCATGTGGGTCAA-L8TX_171026_01_A05,8.631118,-3.1767688 +10X_cells.TTGACTTCAGTAGAGC-L8TX_171026_01_H03,-0.913399,-2.901709 +10X_cells.GGGCACTGTGTAATGA-L8TX_171026_01_D05,9.782821,-3.3524597 +10X_cells.GGACAGATCTCTAAGG-L8TX_171026_01_E05,-1.0095588,-2.6816297 +10X_cells.TTAGGACCATAACCTG-L8TX_171026_01_E05,-1.0806952,-4.2861257 +10X_cells.GTGCGGTTCGCAAACT-L8TX_171026_01_H05,8.672071,-3.6860683 +10X_cells.AGCATACGTTACGTCA-L8TX_181206_01_D12,-0.17070137,-1.9077176 +10X_cells.GAGTCCGAGAACTGTA-L8TX_180406_01_C01,-0.12141256,-3.2676075 +10X_cells.AAAGATGTCATTCACT-L8TX_180221_01_F10,2.7864633,-0.6473533 +10X_cells.TAGTTGGAGCTAAGAT-L8TX_190312_01_B02,-0.48733097,-3.8164504 +10X_cells.CAGCATAGTTACGTCA-L8TX_180221_01_A11,-1.8860817,-3.3319912 +10X_cells.CGTCTACAGCCACGTC-L8TX_180221_01_G10,9.44339,-3.7707558 +10X_cells.GGTGAAGTCAAAGTAG-L8TX_180221_01_F10,1.0497978,-3.3096905 +10X_cells.CGGACTGGTACTCTCC-L8TX_180221_01_D10,0.6648204,-3.5420842 +10X_cells.TACCTATTCGTACCGG-L8TX_180221_01_D10,0.15966918,-3.1899583 +10X_cells.CCAATCCGTTGATTCG-L8TX_180221_01_E10,0.08935029,-1.9567577 +10X_cells.TAGTGGTAGCCCGAAA-L8TX_180221_01_E10,10.196091,-3.2478304 +10X_cells.GAATAAGTCTTGTATC-L8TX_180221_01_F10,-0.61323446,-3.782988 +10X_cells.TCAGATGCATTTCAGG-L8TX_180221_01_F10,10.172941,-3.7158139 +10X_cells.CGCGGTACAATAACGA-L8TX_180221_01_G10,0.04415688,-2.5336661 +10X_cells.ATTATCCAGCAAATCA-L8TX_190312_01_B02,-1.1156046,-2.2014427 +10X_cells.CAGCATAAGTTAAGTG-L8TX_190312_01_B02,-1.7205755,-2.9764047 +10X_cells.GCGGGTTAGTCCGTAT-L8TX_190312_01_B02,0.062469136,-3.5061896 +10X_cells.TGCTACCGTGTGGTTT-L8TX_190312_01_B02,-1.0572903,-2.9399014 +10X_cells.ATCCACCTCCCGACTT-L8TX_190312_01_G02,-1.2087896,-1.7148159 +10X_cells.CGGCTAGTCCTCAACC-L8TX_190312_01_G02,-0.77439946,-2.5132132 +10X_cells.AACCGCGAGCCACGCT-L8TX_181012_01_C05,0.15953065,-3.717496 +10X_cells.CCGGGATCAGACAGGT-L8TX_180926_01_E12,-0.58084434,-3.2057264 +10X_cells.GGGACCTCAATCCGAT-L8TX_180221_01_B11,-0.34251776,-3.4123697 +10X_cells.CGACCTTTCATCACCC-L8TX_190312_01_F02,-1.8549595,-3.756169 +10X_cells.TTTACTGTCCGCAAGC-L8TX_190312_01_F02,0.30079424,-4.010513 +10X_cells.TTTATGCAGCGTCTAT-L8TX_190312_01_A03,-0.8060189,-3.8680465 +10X_cells.GCATGTACACAGCCCA-L8TX_180221_01_C11,-0.5289004,-2.3643675 +10X_cells.CTGGTCTAGAACTGTA-L8TX_180221_01_D11,-0.7435745,-2.1661408 +10X_cells.GCTTGAAGTCGCTTTC-L8TX_180221_01_D11,-0.6334084,-2.5001228 +10X_cells.GTTTCTATCGTGGACC-L8TX_180221_01_D11,-0.5113976,-2.743535 +10X_cells.TCGCGAGAGGCCCTTG-L8TX_180221_01_D11,12.573418,-1.8740277 +10X_cells.TGCGGGTCAAGCCCAC-L8TX_180221_01_D11,-0.3689219,-2.0254798 +10X_cells.TGGGAAGGTACAGACG-L8TX_180221_01_D11,0.37487128,-3.3934114 +10X_cells.TCAGGTAAGGTAGCTG-L8TX_180221_01_F11,0.21738781,-2.86252 +10X_cells.TCCACACGTGTGACGA-L8TX_180221_01_F11,9.8234825,-3.1113796 +10X_cells.CTAGTGAGTCGTCTTC-L8TX_190312_01_H02,-1.7946976,-3.5825486 +10X_cells.AGGCCGTAGCTAGTCT-L8TX_190312_01_A03,-0.39238748,-4.2905326 +10X_cells.GTGAAGGGTACTCGCG-L8TX_180907_01_H11,-0.6351421,-4.16709 +10X_cells.TAGAGCTAGATACACA-L8TX_180907_01_E11,1.092824,-3.489295 +10X_cells.TCAATCTTCTGTACGA-L8TX_180907_01_E11,1.5859923,-2.3309488 +10X_cells.AAAGTAGTCTTGTACT-L8TX_180926_01_D01,0.66945636,-2.311613 +10X_cells.ATAGACCCAACACCCG-L8TX_180926_01_B01,0.09789104,-2.93863 +10X_cells.GGACAGAAGCCCAATT-L8TX_180926_01_B01,1.4505986,-2.4636781 +10X_cells.CCATTCGGTTGTGGCC-L8TX_180926_01_D01,1.035277,-2.3778062 +10X_cells.AAGGTTCGTATGGTTC-L8TX_181011_01_A03,0.18999426,-3.5150871 +10X_cells.CCGGGATGTCTAGCCG-L8TX_181011_01_H03,-0.71579504,-4.3037477 +10X_cells.ACTGCTCCAGCTCGCA-L8TX_180221_01_D12,0.20443588,-1.6609448 +10X_cells.TGACAACAGGTACTCT-L8TX_180221_01_D12,10.4720335,-2.8343759 +10X_cells.CTGATCCGTTGCGTTA-L8TX_180712_01_A06,1.2162746,-2.495906 +10X_cells.TCGAGGCCATTGCGGC-L8TX_180712_01_H05,-1.2826782,-2.0723042 +10X_cells.TTTGCGCGTGCACTTA-L8TX_180712_01_A06,-1.1820091,-3.3667872 +10X_cells.CATCCACCATGTTCCC-L8TX_180221_01_C12,10.493062,-3.6311183 +10X_cells.ATTCTACAGACTGTAA-L8TX_180115_01_D11,-1.4843436,-3.7765996 +10X_cells.GATGAAAAGACGCTTT-L8TX_180115_01_C11,-0.69395953,-3.8323143 +10X_cells.ACACCAAGTAATTGGA-L8TX_180115_01_A09,9.931347,-3.0868719 +10X_cells.TGGCGCAGTCACCTAA-L8TX_180115_01_B09,-0.2468799,-3.7924345 +10X_cells.ACAGCTATCTGCTTGC-L8TX_180115_01_C09,-0.43537143,-3.4202957 +10X_cells.GACACGCTCCAGATCA-L8TX_180115_01_C09,9.709205,-3.5327919 +10X_cells.CAAGGCCTCAGTACGT-L8TX_180115_01_A11,9.961357,-3.1414301 +10X_cells.GGACAAGTCGCATGAT-L8TX_180115_01_H10,0.5812982,-2.838149 +10X_cells.AAAGTAGAGAGGACGG-L8TX_180115_01_B11,0.53836524,-2.1522427 +10X_cells.CAACCTCAGCGTCAAG-L8TX_180115_01_B11,-0.07467535,-2.700718 +10X_cells.CGTCACTCATTCACTT-L8TX_180115_01_B11,-0.24910732,-3.8413105 +10X_cells.TAGACCAAGTGTACTC-L8TX_180115_01_B11,-0.5149291,-3.5810263 +10X_cells.ACTGAACGTGATGCCC-L8TX_180115_01_C11,0.23951799,-2.248633 +10X_cells.CGATGGCGTTCCGGCA-L8TX_180115_01_C11,-0.15768924,-3.7503903 +10X_cells.CCAGCGAAGAAGGTGA-L8TX_180115_01_D11,-1.83569,-3.7902155 +10X_cells.GTAGGCCCACCCAGTG-L8TX_180115_01_D11,-1.7307987,-2.0573475 +10X_cells.TCTATTGCACATCCAA-L8TX_180115_01_D11,0.42254594,-1.6782311 +10X_cells.CCTCAGTTCAGCTCTC-L8TX_180115_01_G10,10.530197,-3.0254445 +10X_cells.CATCGAACAGCTCCGA-L8TX_180115_01_G11,1.6550088,-2.341313 +10X_cells.CGAACATCATCGGTTA-L8TX_180115_01_G11,1.6196401,-2.3223953 +10X_cells.GGCGTGTCACTGTTAG-L8TX_180115_01_H09,0.22737277,-2.5176501 +10X_cells.ACTTGTTCACACGCTG-L8TX_180115_01_E09,-0.91854745,-3.5473313 +10X_cells.AAAGCAAGTTGCGCAC-L8TX_180115_01_G09,0.7150573,-2.1148462 +10X_cells.CGATCGGGTCGCGTGT-L8TX_171120_01_G07,10.229785,-3.3658633 +10X_cells.TGACGGCGTAGCCTCG-L8TX_171120_01_H07,-0.5843519,-3.050254 +10X_cells.CGTCTACCACATTAGC-L8TX_180115_01_G08,-2.1261473,-3.4235191 +10X_cells.TTGACTTAGCTCCTTC-L8TX_171120_01_C07,-0.42310724,-3.1696472 +10X_cells.GTCATTTAGGTAGCTG-L8TX_171120_01_D07,0.9218027,-3.563713 +10X_cells.CGGAGCTGTATAAACG-L8TX_180115_01_E08,0.029552752,-1.879135 +10X_cells.CAAGATCGTAGAAGGA-L8TX_180115_01_E08,-1.1846569,-4.1380596 +10X_cells.TAAGTGCAGACCCACC-L8TX_180115_01_E08,-0.7072124,-4.274955 +Smartseq_cells.LS-15007_S76_E1-50,0.040605813,-4.0251675 +Smartseq_cells.LS-15348_S58_E1-50,-0.40970206,-3.986724 +Smartseq_cells.SM-DAIFD_S49_E1-50,-1.3594669,-3.673623 +Smartseq_cells.SM-DD43W_S77_E1-50,-1.5165539,-1.9085938 +Smartseq_cells.SM-GE66C_S138_E1-50,-1.3517056,-3.8198955 +Smartseq_cells.SM-GE66C_S150_E1-50,-1.9054676,-3.3855479 +Smartseq_cells.SM-GE67T_S004_E1-50,-0.39471635,-4.225871 +Smartseq_cells.SM-GE67T_S102_E1-50,-1.9196876,-2.9842722 +Smartseq_cells.SM-GE67T_S218_E1-50,-0.0853015,-3.320129 +Smartseq_cells.SM-GE91B_S357_E1-50,0.28680992,-4.1897807 +Smartseq_cells.SM-GE67W_S066_E1-50,8.554495,-3.9461074 +10X_cells.GGAGCAAAGAGGGATA-L8TX_180221_01_F09,-2.2299895,1.2439811 +10X_cells.ACTTGTTCATGGGACA-L8TX_180221_01_F09,-2.714653,0.25270185 +10X_cells.GCCAAATTCTTGTATC-L8TX_180221_01_F09,-2.4933105,-0.25142637 +10X_cells.CACACTCGTGCGAAAC-L8TX_180221_01_G09,-0.6515951,1.2369243 +10X_cells.CGGCTAGGTCCATGAT-L8TX_180221_01_G09,-0.9546923,-1.4636441 +10X_cells.GGCGACTCAATGGAAT-L8TX_180221_01_G09,0.46847454,-0.05515965 +10X_cells.GCTTGAAAGGCTACGA-L8TX_180221_01_H09,-2.6532805,0.76346207 +10X_cells.TGCACCTAGAAAGTGG-L8TX_180221_01_A10,-1.626278,1.1776034 +10X_cells.TTCCCAGAGATAGCAT-L8TX_180221_01_B10,0.41437203,-0.43980026 +10X_cells.ATAAGAGCAGTATAAG-L8TX_180221_01_C10,-2.1553142,0.89251995 +10X_cells.CTTTGCGAGACAATAC-L8TX_180221_01_C10,-1.7459198,-2.1085272 +10X_cells.CACACAAAGTACGCGA-L8TX_180406_01_C06,-0.68058866,-0.17432413 +10X_cells.CAGCTGGAGTGGGTTG-L8TX_180406_01_C06,0.49995226,0.15451244 +10X_cells.CCACTACAGGAGCGAG-L8TX_180406_01_C06,-0.7766124,-0.60232216 +10X_cells.TTCTACACACAACGCC-L8TX_180406_01_C06,-2.6103847,-1.7025603 +10X_cells.ATCCACCAGCTGTCTA-L8TX_180221_01_H12,-2.1919427,-1.8794751 +10X_cells.CATGGCGAGATAGTCA-L8TX_180607_01_C05,-0.24535052,-1.9297273 +10X_cells.GTTCTCGTCGCCTGTT-L8TX_180712_01_B06,-2.7725887,-1.0818139 +10X_cells.ACGCCAGGTTTAGGAA-L8TX_180712_01_C06,-2.9190543,-0.13573569 +10X_cells.GGACAAGGTGAGGGAG-L8TX_180712_01_C06,-2.6536653,-0.81411576 +Smartseq_cells.SM-D9D9E_S28_E1-50,-2.8675303,-0.17450921 +10X_cells.TCAACGAGTGTGACGA-L8TX_180907_01_F10,-1.8969123,-1.3127552 +10X_cells.CCGTGGATCGAGCCCA-L8TX_180829_01_D09,-1.9667653,-1.3381454 +10X_cells.ACCTTTAGTAGAGCTG-L8TX_180829_01_D10,0.2898313,-0.23410776 +10X_cells.CAGTCCTGTCTAGAGG-L8TX_180829_01_D10,-1.5326768,0.7024655 +10X_cells.TAGTGGTGTCCGAATT-L8TX_180829_01_D10,-0.76109356,-2.1376297 +10X_cells.TCACGAAAGTGGACGT-L8TX_180829_01_D10,-1.7196462,-1.2188646 +10X_cells.CTACACCAGCCGTCGT-L8TX_180829_01_E10,-0.89077526,-2.460192 +10X_cells.ACTTTCATCAGTGCAT-L8TX_180907_01_F10,-2.7296042,-1.4536791 +10X_cells.ACGATGTAGCTATGCT-L8TX_181011_01_G02,1.4799882,-1.7809181 +10X_cells.AGTGTCATCGTCTGCT-L8TX_181011_01_H02,-2.9556825,-0.871132 +10X_cells.TCAGCTCTCGTCTGCT-L8TX_181011_01_H02,-2.643518,-1.2400749 +10X_cells.GGAATAAGTCTAGCGC-L8TX_181011_01_C04,-1.2308724,-1.5320357 +10X_cells.GGGCATCCAGGTGCCT-L8TX_181011_01_C04,1.6751642,-1.5996171 +10X_cells.TACACGAAGAAGGTGA-L8TX_181012_01_G04,-2.1759605,-0.35102984 +10X_cells.CACACTCAGCTCCTCT-L8TX_181012_01_H04,-1.5418794,0.299573 +10X_cells.CACCAGGAGCATCATC-L8TX_181012_01_H04,-1.3433595,-2.2872357 +10X_cells.AGAGCGAGTGGTTTCA-L8TX_180406_01_H02,2.5888615,11.028413 +10X_cells.ATGCGATTCCTTGACC-L8TX_180406_01_H01,-0.04013447,0.30229294 +10X_cells.CAAGAAATCTACTTAC-L8TX_180406_01_H01,-0.71141344,0.6880197 +10X_cells.GACTACACACGCCAGT-L8TX_180406_01_E06,-0.27006185,1.2947559 +10X_cells.TCATTACAGTCCAGGA-L8TX_180406_01_E06,-0.33959156,1.1355354 +10X_cells.AAAGTAGTCTAACTGG-L8TX_180406_01_C07,-0.05956371,0.99904186 +10X_cells.TACCTATAGATGCGAC-L8TX_180406_01_C07,2.730464,11.551668 +10X_cells.CGACTTCGTCGGGTCT-L8TX_180406_01_E07,2.8568196,10.623456 +10X_cells.CGCCAAGTCCCGGATG-L8TX_180406_01_E07,2.7249315,11.285701 +Smartseq_cells.SM-GE5VC_S269_E1-50,-3.02378,-1.0873809 +10X_cells.GTTTCTAAGACTTGAA-L8TX_171026_01_F03,-1.908029,-1.9265093 +10X_cells.GCTGGGTGTGCTAGCC-L8TX_171026_01_E05,-1.9438092,-1.9826211 +10X_cells.GCTGCGAAGATGCCAG-L8TX_171026_01_H04,2.5751657,-0.6662882 +10X_cells.ACACTGAAGAGGACGG-L8TX_171026_01_F03,-1.7013987,-1.430861 +10X_cells.CAACTAGGTTTGACTG-L8TX_171026_01_F03,-1.9693135,-0.4048236 +10X_cells.GACCAATTCACCCGAG-L8TX_171026_01_F03,-2.2031512,-3.2880616 +10X_cells.GCTTGAAGTATAGTAG-L8TX_171026_01_F03,-2.1882017,-1.7747295 +10X_cells.CCTTTCTAGAGCTATA-L8TX_171026_01_B04,-1.9286051,-3.359001 +10X_cells.ACCCACTTCGGTTCGG-L8TX_171026_01_F04,-1.4754109,-1.3478992 +10X_cells.CGTGTAACAGTAGAGC-L8TX_171026_01_F04,-0.78488845,0.045632605 +10X_cells.CTCAGAACAGATCTGT-L8TX_171026_01_F04,2.6703148,-0.82295436 +10X_cells.CTCGAAAAGGGCTCTC-L8TX_171026_01_F04,-0.62679434,0.948281 +10X_cells.ACACTGAAGGATGCGT-L8TX_171026_01_B05,-1.5235604,-1.6583585 +10X_cells.GCACTCTAGATCACGG-L8TX_171026_01_B05,-2.2758048,-2.8148506 +10X_cells.GGGTTGCCAGCTATTG-L8TX_171026_01_A05,-2.8516605,0.44431466 +10X_cells.CTGCTGTGTGGCCCTA-L8TX_171026_01_H03,-1.1351464,-0.8450628 +10X_cells.GTCGTAACATAACCTG-L8TX_171026_01_A04,-2.8014913,-2.2836204 +10X_cells.CGATCGGCAGGAATGC-L8TX_171026_01_E05,-0.79706335,-0.21263883 +10X_cells.CGGAGCTTCGTAGGAG-L8TX_171026_01_F05,-2.529077,-2.1904912 +Smartseq_cells.LS-15538_S91_E1-50,-2.520965,-1.463017 +Smartseq_cells.SM-GE92I_S106_E1-50,-2.1027894,-1.665843 +10X_cells.CTGAAGTTCGCGCCAA-L8TX_181206_01_F12,-0.56634104,-1.1655095 +10X_cells.TGTATTCTCGAATGCT-L8TX_181206_01_B12,-1.683187,-2.382008 +10X_cells.CCGGGATTCCACGTGG-L8TX_181206_01_C12,-1.6152531,-1.0378973 +10X_cells.TGACGGCCATTCCTCG-L8TX_181206_01_C12,-1.1232862,-1.6307974 +10X_cells.ACGCAGCAGCAGCCTC-L8TX_181206_01_D12,-1.6855761,-1.5728489 +10X_cells.CTCAGAATCTAACTTC-L8TX_181206_01_D12,-2.3956847,-1.727272 +Smartseq_cells.SM-GE915_S247_E1-50,-1.1840316,-2.5470557 +10X_cells.AGCGTCGCACACTGCG-L8TX_180406_01_B02,0.5490248,-1.7606846 +10X_cells.CTACGTCAGACAGAGA-L8TX_180406_01_C01,0.56764984,1.092233 +10X_cells.GATCAGTGTCAAACTC-L8TX_180406_01_E01,-1.1865869,1.5429425 +10X_cells.GGTGCGTAGCCCGAAA-L8TX_180406_01_C02,2.5893254,10.782799 +10X_cells.GGAGCAATCAACGGCC-L8TX_180221_01_A11,-0.025865005,-0.9509246 +10X_cells.TCGTACCCAGTCACTA-L8TX_180221_01_H10,1.0034524,0.7294697 +10X_cells.GGGAATGCAGCTGCTG-L8TX_190312_01_D02,-1.7557286,1.0499682 +10X_cells.TCCCGATAGGCTAGGT-L8TX_180221_01_D10,-0.980566,0.8423664 +10X_cells.TTAGGACTCGTTGACA-L8TX_180221_01_D10,-1.9210886,0.4064823 +10X_cells.CCTTACGCACGTTGGC-L8TX_180221_01_E10,0.5245861,-0.41773954 +10X_cells.AAGCCGCTCGCTGATA-L8TX_180221_01_F10,-2.8548625,-2.3608677 +10X_cells.ACTGCTCTCTGCTTGC-L8TX_180221_01_F10,-1.2719327,-0.72659415 +10X_cells.CACCAGGAGATGCGAC-L8TX_180221_01_F10,-1.4528946,-1.9224968 +10X_cells.GAGCAGACAATTGCTG-L8TX_180221_01_F10,-1.2648526,0.5173788 +10X_cells.TGACTTTGTCATCCCT-L8TX_180221_01_F10,-0.30075735,0.384009 +10X_cells.CATTATCGTGCAACTT-L8TX_180221_01_G10,-0.69713503,-1.523667 +10X_cells.GTTCTCGAGATGAGAG-L8TX_180221_01_G10,0.5608109,-0.33629695 +10X_cells.GGAACTTCATGGTCTA-L8TX_180221_01_H10,-1.8425624,0.19811246 +10X_cells.TGAAAGAAGCCGGTAA-L8TX_190312_01_B02,-0.67330366,-0.6015262 +10X_cells.GAACGGAAGAAGGCCT-L8TX_190312_01_C02,-0.26573032,-0.46366554 +10X_cells.TTGGAACTCTTGGGTA-L8TX_190312_01_C02,-1.1055706,-0.42642727 +10X_cells.TGGACGCCAATGAATG-L8TX_190312_01_D02,-2.277975,-0.47516853 +10X_cells.CCGTTCATCATCTGTT-L8TX_190312_01_G02,2.7417667,12.225941 +10X_cells.GAATAAGTCAACACAC-L8TX_180926_01_C12,-2.141741,-1.9059258 +10X_cells.AAGTCTGAGGAGTAGA-L8TX_180221_01_B11,-0.18524736,-2.593414 +10X_cells.ACACTGAAGCGTGAAC-L8TX_180221_01_B11,-0.29058966,-1.4478034 +10X_cells.TCAATCTCAGCATACT-L8TX_180221_01_C11,-1.3098116,0.6723055 +10X_cells.TGAGCCGAGGACTGGT-L8TX_180221_01_C11,-0.88601756,-0.08517548 +10X_cells.CAACCTCTCGTTTGCC-L8TX_180221_01_D11,-0.8985622,0.082216464 +10X_cells.CCATGTCCACGGCGTT-L8TX_180221_01_D11,-0.09110061,-1.1970689 +10X_cells.ATGCGATGTTCCCTTG-L8TX_180221_01_F11,0.23614144,-0.64572686 +10X_cells.TGTGTTTCAGGTCGTC-L8TX_180221_01_F11,-0.24901235,-2.5809755 +10X_cells.TACCTTATCGGTTAAC-L8TX_180221_01_G11,-0.30651346,-2.4403625 +10X_cells.GAACATCCAAGACACG-L8TX_190312_01_H02,-2.0058243,-3.3023298 +10X_cells.CATCAGACATTGTGCA-L8TX_180907_01_H11,-2.3230016,-3.0923069 +10X_cells.GGACATTCACCGATAT-L8TX_190312_01_A02,-1.945392,-3.6937847 +10X_cells.CGGACGTAGGGTGTGT-L8TX_180926_01_F01,0.06574911,-0.65711296 +10X_cells.ACACTGAGTATTCTCT-L8TX_180926_01_B01,-0.34135455,-0.7694189 +10X_cells.TCACGAAGTACTCGCG-L8TX_180926_01_B01,2.890969,-0.37260202 +10X_cells.TTAGGCAAGGTCATCT-L8TX_180926_01_D01,-1.3860828,0.5948621 +10X_cells.AAACCTGGTACTCTCC-L8TX_180926_01_E01,-2.5557764,-1.2572253 +10X_cells.GCCTCTAGTTACGACT-L8TX_181011_01_B03,-2.7827592,-0.42034104 +10X_cells.ACCAGTACACACCGAC-L8TX_181011_01_C03,-0.89690924,-1.9709029 +10X_cells.GCTTCCACAGTCGATT-L8TX_181011_01_C03,-3.017172,-1.7614943 +10X_cells.AGGCCGTAGAGTCTGG-L8TX_181011_01_H03,-2.5160937,-1.7943417 +10X_cells.AGGGATGAGGCCATAG-L8TX_180712_01_H05,-1.7503422,0.002316618 +10X_cells.CGCGGTAAGTATCTCG-L8TX_180712_01_E05,-0.18707088,-1.3362759 +10X_cells.CTAGAGTTCAACGAAA-L8TX_180221_01_H11,0.34995005,-1.0954839 +10X_cells.CAAGATCGTTCCATGA-L8TX_180712_01_F05,-0.13710961,-1.6130059 +10X_cells.CTAGCCTCAAAGTGCG-L8TX_180712_01_H05,-1.827142,0.24326082 +10X_cells.CGATCGGGTCCGTGAC-L8TX_180712_01_A06,-2.4879324,-0.3201315 +10X_cells.CGTAGCGTCAGTTGAC-L8TX_180221_01_A12,0.32285848,-1.18003 +10X_cells.ATCTACTCAGGCAGTA-L8TX_180221_01_B12,-0.18871431,-0.26585186 +10X_cells.GGGAATGGTAGCGCTC-L8TX_180221_01_B12,1.2251383,1.5038085 +10X_cells.CAACTAGAGCCATCGC-L8TX_180221_01_C12,-0.016866866,-0.9902074 +10X_cells.TACTCATAGATCCCGC-L8TX_180221_01_C12,-0.26032397,0.96620804 +10X_cells.CCTAAAGTCAACCATG-L8TX_200611_02_A05,-2.0500407,0.6908735 +10X_cells.GACTAACAGGAGTAGA-L8TX_200611_02_A05,1.6237655,-1.5772988 +10X_cells.GACTGCGTCTGTTGAG-L8TX_180115_01_B11,-0.6325124,-1.286768 +10X_cells.GACGTGCTCGCGTTTC-L8TX_180115_01_E10,0.31963164,-0.17677957 +10X_cells.AGCTTGAGTTTGGCGC-L8TX_180115_01_B11,-1.7584025,-1.5694116 +10X_cells.CCAGCGATCACATGCA-L8TX_180115_01_E10,-0.91717315,-2.8615203 +10X_cells.ACCGTAAGTCGCATAT-L8TX_180115_01_A09,-1.5178465,-2.051197 +10X_cells.CTCGGGACAAGAAGAG-L8TX_180115_01_A09,0.18401413,-0.7522129 +10X_cells.GTACTCCTCTAACTCT-L8TX_180115_01_B10,-1.1932132,-1.5937587 +10X_cells.GTGGGTCTCCGGCACA-L8TX_180115_01_D11,-2.1350598,-3.0308962 +10X_cells.ATCGAGTCAGTTCCCT-L8TX_180115_01_G10,0.24185038,-0.42922354 +10X_cells.GGCTCGAGTCAATACC-L8TX_180115_01_H11,-2.4643028,-3.0491602 +10X_cells.AACGTTGCACCGAATT-L8TX_180115_01_G08,-2.5500991,-3.1041503 +10X_cells.GGCGTGTAGGATGTAT-L8TX_180115_01_E08,-0.96586686,-2.9046211 +Smartseq_cells.LS-15074_S49_E1-50,-2.60493,-2.502986 +Smartseq_cells.SM-GE635_S083_E1-50,-2.0681763,-2.8738716 +Smartseq_cells.SM-GE66C_S154_E1-50,-1.117464,-2.6629353 +Smartseq_cells.SM-GE66C_S173_E1-50,-0.36565235,-2.2404559 +10X_cells.AAACGGGAGACTTTCG-L8TX_180221_01_F09,-0.6748642,-0.47846332 +10X_cells.CGTGAGCGTCAACATC-L8TX_180221_01_H09,-1.4981545,-0.26270252 +10X_cells.TTTGTCACATTCCTCG-L8TX_180607_01_C05,-1.6515546,0.8656078 +10X_cells.ATCATGGCAACGCACC-L8TX_180406_01_E07,2.790293,-0.2670705 +10X_cells.ATAAGAGAGTTCCACA-L8TX_180406_01_H01,1.202763,0.26376575 +10X_cells.ATCTGCCGTAAATGTG-L8TX_180406_01_H01,1.0264518,0.32494318 +10X_cells.CCATTCGCAAACCCAT-L8TX_180406_01_H01,1.5181154,-1.8915343 +10X_cells.CGATGTAAGATGAGAG-L8TX_180406_01_H01,0.92750597,0.71466655 +10X_cells.CTCATTAGTAAAGGAG-L8TX_180406_01_H01,1.0453378,-0.13446152 +10X_cells.GGTGTTAAGAGCTGCA-L8TX_180406_01_H01,-0.3834309,1.234367 +10X_cells.TCTGAGAGTGTGCGTC-L8TX_180406_01_H01,0.83441746,1.1611785 +10X_cells.AAACCTGGTCACCCAG-L8TX_180406_01_E02,-0.092433296,-0.28042758 +10X_cells.GAATAAGTCAACTCTT-L8TX_180406_01_E02,1.070161,1.199592 +10X_cells.TACGGGCCAAGCTGTT-L8TX_180406_01_E02,0.6465359,-0.6627403 +10X_cells.TCCACACCATTGTGCA-L8TX_180406_01_E02,0.7919831,-0.60968214 +10X_cells.CTTAGGATCCTGCAGG-L8TX_180406_01_G02,0.9974081,0.1886708 +10X_cells.TTCTTAGCACATCCAA-L8TX_180406_01_G02,0.17995504,0.67931485 +10X_cells.ATAACGCCAATCACAC-L8TX_180406_01_H02,1.8615072,-2.1514628 +10X_cells.CTGCTGTGTCTGCCAG-L8TX_180406_01_H02,0.008880653,1.419612 +10X_cells.TGTCCCATCCTGCCAT-L8TX_180406_01_H02,-0.51081467,0.8760529 +10X_cells.AACTCCCAGCGTCTAT-L8TX_180406_01_B06,0.825011,0.91746926 +10X_cells.CTACCCACAAACTGTC-L8TX_180406_01_B06,1.0420048,-0.2276012 +10X_cells.CTTACCGTCGCGGATC-L8TX_180406_01_B06,0.8706797,0.058024567 +10X_cells.CTTCTCTGTGTGAATA-L8TX_180406_01_B06,1.1303091,-0.1527332 +10X_cells.CTTCTCTTCTGATTCT-L8TX_180406_01_B06,0.28319442,-0.28928405 +10X_cells.ACGCCAGAGGGAACGG-L8TX_180406_01_E06,1.174912,-1.2769578 +10X_cells.CAGATCAGTTGAGGTG-L8TX_180406_01_E06,1.1941385,0.3374813 +10X_cells.GCCTCTATCGCGGATC-L8TX_180406_01_E06,0.6902631,-0.0828399 +10X_cells.GTTACAGAGTGGAGAA-L8TX_180406_01_E06,0.76553166,-0.21431331 +10X_cells.TCTTTCCGTCGCATAT-L8TX_180406_01_E06,0.8277625,0.24192597 +10X_cells.CAGCGACAGCAATATG-L8TX_180406_01_C08,0.6641945,-0.6072142 +10X_cells.CGGACGTAGCGATGAC-L8TX_180406_01_C08,0.6642176,0.21515664 +10X_cells.GAACATCAGGAATGGA-L8TX_180406_01_C08,0.3830928,0.624032 +10X_cells.ATCATGGGTGTGAAAT-L8TX_180406_01_C07,1.1212128,-0.3648191 +10X_cells.CCCTCCTCACTTGGAT-L8TX_180406_01_C07,-0.21649697,0.9480944 +10X_cells.TGGCGCAGTCCGAAGA-L8TX_180406_01_C07,1.1949158,1.3831773 +10X_cells.TTGGCAACATGGTAGG-L8TX_180406_01_C07,1.0495607,0.4664584 +10X_cells.CAGCCGAAGATCTGCT-L8TX_180406_01_E07,-1.0055,-0.6783051 +10X_cells.CGATGGCAGAGACTAT-L8TX_180406_01_E07,0.60151607,-0.10654036 +10X_cells.CTGATCCCAGACTCGC-L8TX_180406_01_E07,-0.61689913,0.12561233 +Smartseq_cells.SM-GE91H_S080_E1-50,-0.2793372,0.22984537 +Smartseq_cells.SM-GE91C_S168_E1-50,-0.20347469,-1.5887121 +Smartseq_cells.SM-GE91C_S250_E1-50,-0.47017685,-2.4358127 +10X_cells.ACACCGGAGGGCACTA-L8TX_180406_01_C02,0.9914124,1.3320254 +10X_cells.GTAACTGGTTATCCGA-L8TX_180406_01_C01,0.20841956,-0.04212351 +10X_cells.ACTGATGGTACCGTTA-L8TX_180406_01_B01,0.7144966,0.4498913 +10X_cells.CGTTGGGAGGTGCAAC-L8TX_180406_01_B01,-0.6129493,0.09302087 +10X_cells.GAAGCAGTCAGCACAT-L8TX_180406_01_C01,0.46569484,-0.7281216 +10X_cells.GCAAACTGTCCGAACC-L8TX_180406_01_C01,0.85898024,0.45325986 +10X_cells.ATGAGGGTCACCACCT-L8TX_180406_01_E01,0.46235877,0.45984805 +10X_cells.CCACGGACAAAGGTGC-L8TX_180406_01_E01,0.37961233,0.95376694 +10X_cells.CTACATTGTTATCCGA-L8TX_180406_01_E01,0.92183834,0.83821106 +10X_cells.TTTATGCTCATGTCCC-L8TX_180406_01_E01,0.07857973,0.8699738 +10X_cells.CGCTTCACAGACAAAT-L8TX_180406_01_F01,0.22675163,0.5252958 +10X_cells.AAACGGGAGGGTCGAT-L8TX_180406_01_G01,0.4637707,1.7733858 +10X_cells.CGGTTAACACACCGCA-L8TX_180406_01_G01,0.20079024,0.40032357 +10X_cells.TCGAGGCGTACGACCC-L8TX_180406_01_G01,0.3954897,0.75229925 +10X_cells.CTAACTTAGACTTTCG-L8TX_180406_01_B02,0.25202465,0.59397614 +10X_cells.GCCTCTAAGGCTCATT-L8TX_180406_01_B02,0.007348688,1.2621433 +10X_cells.AGCAGCCTCTTCATGT-L8TX_180406_01_C02,-2.3256862,0.75035983 +10X_cells.GCGACCAAGTATGACA-L8TX_180406_01_C02,0.51631856,0.95721704 +10X_cells.GGCTGGTCAGTAAGCG-L8TX_180406_01_C02,0.4360338,0.47784504 +10X_cells.ACTTGTTAGGACGAAA-L8TX_180406_01_D02,1.1385251,0.3617705 +10X_cells.AGCATACTCTGCAAGT-L8TX_180406_01_D02,1.378491,0.025876554 +10X_cells.CCACGGATCAGCTCTC-L8TX_180406_01_D02,1.1061413,-0.8621519 +10X_cells.TTAGGACCAATCTGCA-L8TX_180221_01_E10,0.798812,0.52296835 +10X_cells.CTTCTCTGTAGCCTAT-L8TX_190312_01_D02,2.1949852,0.33229968 +10X_cells.CACAGGCCAAGCTGGA-L8TX_180221_01_G11,-0.78204256,0.18857542 +10X_cells.TTAACTCGTGTCCTCT-L8TX_180221_01_F11,0.39127612,-0.37764087 +Smartseq_cells.SM-GE91B_S112_E1-50,-1.4344405,-0.743077 +10X_cells.ACGAGGATCCTCTAGC-L8TX_180504_01_E01,-1.0007533,-0.7725566 +Smartseq_cells.SM-GE91C_S307_E1-50,-2.2188983,-0.6840924 +10X_cells.GTGCATAGTAGCGATG-L8TX_180221_01_B10,-0.7282311,-0.8149469 +10X_cells.CTCACACTCGGTTAAC-L8TX_180406_01_F02,-2.6900282,-0.33029217 +10X_cells.GGAGCAATCATGTGGT-L8TX_180406_01_F02,-1.1944029,-2.0616822 +10X_cells.AGAGCGACAGGTCTCG-L8TX_180406_01_C06,-1.8692014,-0.059532344 +10X_cells.ATTACTCAGAATGTGT-L8TX_180406_01_C06,-0.15149172,-0.63575906 +10X_cells.TGTGTTTCAGATAATG-L8TX_180221_01_H12,-0.8258443,-1.837305 +10X_cells.CGCGTTTCATGTAGTC-L8TX_180221_01_D09,-0.6046884,-1.5191007 +10X_cells.GTCACGGGTACCGTAT-L8TX_180607_01_C05,-1.3977491,-1.2016784 +10X_cells.TTTGCGCAGACGCAAC-L8TX_180712_01_G05,0.08806536,-0.2813804 +10X_cells.GACTGCGAGAGTGACC-L8TX_180829_01_D10,-0.018084675,-0.71779424 +10X_cells.ACATCAGGTCATTAGC-L8TX_180829_01_D09,-1.4058096,-1.2762095 +10X_cells.CTAATGGCAGCCAGAA-L8TX_180829_01_D10,-1.2280029,-1.0568199 +10X_cells.TCAGCAAGTATAAACG-L8TX_180829_01_D09,-0.21394801,-1.8830456 +10X_cells.TTGAACGTCACGATGT-L8TX_180829_01_D09,-0.96432483,-1.4231557 +10X_cells.CACCAGGGTCTGATCA-L8TX_180829_01_D10,0.46623468,-0.14232022 +10X_cells.CCACTACTCTTTAGGG-L8TX_180829_01_D10,-2.4897115,-1.2437063 +10X_cells.GAATGAACATCACCCT-L8TX_180829_01_D10,1.3740157,-2.0058053 +10X_cells.ACTGAACCACTAAGTC-L8TX_180907_01_F10,-1.5020704,-2.4515555 +10X_cells.GCTGCGATCATGTCCC-L8TX_180907_01_F10,-0.9468384,-1.2339725 +10X_cells.GTTCGGGAGGGAACGG-L8TX_181011_01_H02,-0.24480349,-0.71485114 +10X_cells.AGCCTAAGTCAACTGT-L8TX_181011_01_C04,-0.02674907,-1.7213933 +10X_cells.TCACGAACATCATCCC-L8TX_181011_01_C04,-0.9868878,-1.2903601 +10X_cells.GACGTTATCTACGAGT-L8TX_181012_01_G04,0.5092037,-1.8842715 +10X_cells.GCGCAACAGGTGCTTT-L8TX_181012_01_G04,-0.58456844,-2.7831569 +10X_cells.ATTGGTGCAACTTGAC-L8TX_181012_01_H04,-1.5301355,-1.4716836 +10X_cells.CGCGGTACAGCCTGTG-L8TX_181012_01_E05,-0.20828609,-0.8295934 +10X_cells.CCGGGATAGCTTATCG-L8TX_180406_01_E02,0.64284724,0.3618203 +10X_cells.TTCGAAGTCGCTTGTC-L8TX_171026_01_B04,-2.3948941,-1.9513254 +10X_cells.CTCACACTCACGCATA-L8TX_171026_01_B05,-2.304973,-1.914797 +10X_cells.CGCTATCGTTACGGAG-L8TX_171026_01_F03,1.4278423,-2.1705732 +10X_cells.ATGAGGGAGCACAGGT-L8TX_171026_01_F04,-1.4010544,-2.3265004 +10X_cells.CGTGTAAAGGACACCA-L8TX_171026_01_F04,-2.4442291,-1.2753304 +10X_cells.ATTGGTGCATTATCTC-L8TX_171026_01_G04,-2.7128294,-1.0257806 +10X_cells.GGGCATCTCGAATGCT-L8TX_171026_01_G04,-2.4893703,-0.70117086 +10X_cells.CGGCTAGTCCTTGCCA-L8TX_171026_01_B05,-0.056192424,-0.6861614 +10X_cells.CTCGTACCATTAGCCA-L8TX_171026_01_B05,-2.173801,-1.6897423 +10X_cells.ATCTACTTCGAATGGG-L8TX_171026_01_H03,-1.7050834,-2.2665207 +10X_cells.ACGAGGATCGGCTACG-L8TX_171026_01_A04,-2.2550688,-1.4624171 +10X_cells.ACCAGTATCCGTTGTC-L8TX_171026_01_E05,-1.9513483,-1.8910214 +10X_cells.AGCGTATAGTTGAGTA-L8TX_171026_01_F05,-1.7468728,-1.7832804 +10X_cells.GACTACATCCCGACTT-L8TX_171026_01_G05,-2.4006095,-1.7742937 +10X_cells.GAAGCAGAGGGCTTGA-L8TX_181206_01_C12,-1.1854341,-1.391936 +10X_cells.ACATCAGTCAAACAAG-L8TX_181206_01_D12,-1.2367942,-2.6573696 +10X_cells.GACAGAGTCAAAGTAG-L8TX_181206_01_D12,-1.1913903,-1.5760872 +10X_cells.CACATAGAGAGTCTGG-L8TX_181206_01_E12,-1.7413585,-1.8533283 +10X_cells.GGGACCTAGCTTATCG-L8TX_180221_01_D10,-1.8880435,-0.5377011 +10X_cells.AAGGAGCTCACGAAGG-L8TX_180221_01_E10,-1.5590262,-0.5191662 +10X_cells.CGGAGTCAGGCCCTTG-L8TX_180221_01_E10,-0.515597,-3.0794196 +10X_cells.CGTGTAAGTTGAACTC-L8TX_180221_01_F10,-2.7655683,-1.2537878 +10X_cells.GGTGTTAAGTATGACA-L8TX_180221_01_F10,-2.4970682,-3.1095126 +10X_cells.CTCACACGTAGCCTCG-L8TX_180221_01_A11,-1.9719895,-0.9238224 +10X_cells.AGCAGCCTCGAGAGCA-L8TX_190312_01_C02,-2.0621521,-3.0664876 +10X_cells.GATCGATCAAGCGCTC-L8TX_190312_01_C02,-2.2358017,-3.0871441 +10X_cells.CTGAAGTGTCTCTCGT-L8TX_180926_01_E12,-2.6094139,-1.9505866 +10X_cells.TTTCCTCCAAGTTAAG-L8TX_180926_01_E12,-0.3937012,-1.7217311 +10X_cells.CCCAATCTCCTGCTTG-L8TX_181012_01_B05,-1.3248208,-0.86578864 +10X_cells.GTACTCCTCCGCGGTA-L8TX_180907_01_H11,-2.3846154,-2.4890726 +10X_cells.CACACCTTCAACGGCC-L8TX_180907_01_E11,0.22824709,-1.7045282 +10X_cells.ACGCCAGGTTCCATGA-L8TX_190312_01_D01,-2.383262,-0.9288865 +10X_cells.GATTCAGCAGACGCAA-L8TX_190312_01_F01,-0.8203305,-0.26984498 +10X_cells.CTAATGGCATGGTTGT-L8TX_190312_01_A02,-2.6819,-2.1326194 +10X_cells.CAAGTTGGTATGGTTC-L8TX_180926_01_B01,-0.89185256,-1.3076521 +10X_cells.TCGCGAGAGAGTTGGC-L8TX_180926_01_B01,0.30888462,-0.22496904 +10X_cells.CGGAGTCGTGATGTGG-L8TX_180926_01_D01,0.3475806,-1.5560164 +10X_cells.GATGAGGAGAGTTGGC-L8TX_180926_01_D01,-0.90326816,-1.450069 +10X_cells.CCTACACAGACTAGGC-L8TX_180926_01_F01,-1.2684155,-2.8150628 +10X_cells.GCAGCCAAGAATTGTG-L8TX_180712_01_F05,0.07873788,-1.8849456 +10X_cells.ACATACGTCCATGAGT-L8TX_180712_01_H05,-0.7460426,-2.2935967 +10X_cells.GCACTCTTCTTCCTTC-L8TX_180712_01_H05,-1.9090158,-0.3167438 +10X_cells.TCAGCAAGTCGCGTGT-L8TX_180504_01_E01,-1.5043422,-1.721842 +10X_cells.AGGGATGTCAACTCTT-L8TX_180221_01_D12,0.15719704,-0.9075292 +10X_cells.GCCAAATGTGCAACTT-L8TX_180221_01_H11,0.8333303,-1.9078326 +10X_cells.TTAGGACCAGTCGATT-L8TX_180221_01_H11,0.45366368,-1.2682714 +10X_cells.AGTTGGTCAGTATAAG-L8TX_200611_02_A05,-1.0504811,-1.0105417 +10X_cells.GAACGGACAGGATTGG-L8TX_180115_01_G09,0.4673732,-0.35405567 +10X_cells.GTTAAGCAGGCCCTTG-L8TX_180115_01_B09,-0.033627067,-2.1134892 +10X_cells.CATATTCGTGACTACT-L8TX_180115_01_C09,-1.371261,-2.2440996 +10X_cells.GTGCAGCGTCCAGTTA-L8TX_180115_01_C09,-0.63349354,-3.3036394 +10X_cells.TTAACTCAGTCTCCTC-L8TX_180115_01_C09,-2.0569434,-2.203427 +10X_cells.CCGTTCATCGTCGTTC-L8TX_180115_01_H10,-0.38147807,-0.9484837 +10X_cells.TACGGATAGGTTCCTA-L8TX_180115_01_H10,-1.3723084,-1.9225984 +10X_cells.TCTCTAAAGGATGTAT-L8TX_180115_01_B10,-1.4043888,-2.0820417 +10X_cells.TTGGCAAGTTCGCTAA-L8TX_180115_01_B11,-0.67005956,-2.8269992 +10X_cells.AGCGGTCCATGATCCA-L8TX_180115_01_C10,-1.2570549,-1.5295701 +10X_cells.TGACTTTTCCAATGGT-L8TX_180115_01_C10,-0.14380583,-0.70052624 +10X_cells.CATGGCGAGATGTGGC-L8TX_180115_01_C11,-1.2197953,-1.085192 +10X_cells.TACTTACAGACGCACA-L8TX_180115_01_C11,-1.745321,-2.1174405 +10X_cells.CGTCACTTCAAGGCTT-L8TX_180115_01_D11,-1.3883383,-3.1525207 +10X_cells.GTGAAGGGTGCAACTT-L8TX_180115_01_D11,-2.0381188,-2.4186356 +10X_cells.TGCCAAAAGCCCAACC-L8TX_180115_01_D11,-1.635273,-2.5171356 +10X_cells.AAAGATGAGCCGATTT-L8TX_180115_01_F10,-1.2913947,-1.4727716 +10X_cells.GACCTGGTCCGGCACA-L8TX_180115_01_E11,-1.9966818,-0.94985664 +10X_cells.ACGGCCAGTTCAACCA-L8TX_180115_01_F11,-1.8823746,-2.9782014 +10X_cells.CCATGTCCACGAGGTA-L8TX_180115_01_F11,-1.6827047,-2.318548 +10X_cells.GAAGCAGGTGCACTTA-L8TX_180115_01_F11,-1.9434028,-2.5902824 +10X_cells.GTGCGGTCACGAAACG-L8TX_180115_01_F11,-1.8675296,-1.8737559 +10X_cells.ACGCCAGGTACCGGCT-L8TX_180115_01_G11,-0.1498828,-1.4864186 +10X_cells.GGACGTCGTAGCGTAG-L8TX_180115_01_G11,-1.8666039,-2.0511947 +10X_cells.TTCGGTCGTCGAGTTT-L8TX_180115_01_G11,-1.8952836,-2.5620642 +10X_cells.TTGCGTCAGCTTATCG-L8TX_180115_01_H11,-1.8321272,-3.432603 +10X_cells.TTGCCGTGTAATAGCA-L8TX_180115_01_G09,0.38171893,-0.28515184 +10X_cells.CTTACCGGTCGCGGTT-L8TX_171120_01_G07,-2.6159449,-2.2419589 +10X_cells.ATTCTACCATGCGCAC-L8TX_171120_01_H07,-1.9881092,-2.1165469 +10X_cells.TAAGAGAAGGATGGAA-L8TX_171120_01_D07,-0.9944722,-2.238176 +10X_cells.AGCTCCTTCGACGGAA-L8TX_171120_01_C07,-0.37350616,-1.3453351 +10X_cells.ATCGAGTCAACACCTA-L8TX_171120_01_C07,-1.9467512,-1.6898614 +10X_cells.GGGCACTGTCTTGCGG-L8TX_171120_01_C07,-2.8284347,-1.6645404 +10X_cells.CGGACACGTGCGGTAA-L8TX_180115_01_H08,-2.4895601,-0.3266287 +10X_cells.AACACGTCATACTACG-L8TX_171120_01_E07,0.13581923,-1.6504681 +10X_cells.ACAGCCGGTCTCATCC-L8TX_171120_01_E07,-1.8107202,-2.4853184 +10X_cells.ACGTCAACACTTCGAA-L8TX_171120_01_E07,-1.6436191,-3.2228842 +10X_cells.GCGCAACGTCTCCCTA-L8TX_171120_01_E07,0.7487973,-1.6325599 +10X_cells.TCATTACGTCACAAGG-L8TX_171120_01_F07,-1.7168449,-2.2139096 +10X_cells.AGAGTGGCACCGATAT-L8TX_180115_01_E08,-2.6493447,-2.3175502 +Smartseq_cells.LS-15000_S40_E1-50,-1.6704785,-2.2435858 +Smartseq_cells.LS-15300_S21_E1-50,-1.6802202,-2.8107605 +Smartseq_cells.LS-15385_S08_E2-50,-1.9827121,-2.2908745 +Smartseq_cells.LS-15500_S84_E1-50,-2.4502754,-2.374313 +Smartseq_cells.SM-D9EP5_S95_E1-50,-2.5974083,-2.0942943 +Smartseq_cells.SM-D9CXP_S41_E1-50,-2.3372478,-1.472679 +Smartseq_cells.SM-GE67T_S010_E1-50,-2.8877032,-1.2356302 +Smartseq_cells.SM-GE67T_S206_E1-50,-2.931519,-1.162441 +Smartseq_cells.SM-GE67T_S296_E1-50,-2.8381782,-1.092664 +Smartseq_cells.SM-GE67X_S066_E1-50,-1.2029626,-3.6238408 +10X_cells.AACTCAGGTTCCTCCA-L8TX_180221_01_C10,-0.4616724,-2.1413908 +10X_cells.TTCTCAAGTCTAGGTT-L8TX_180221_01_G09,-2.0947359,-0.39459568 +10X_cells.ACGCAGCCAGATAATG-L8TX_180221_01_B10,-0.8234319,-3.06371 +10X_cells.TTGCGTCTCAAACAAG-L8TX_180221_01_C10,-1.7407414,-1.4696833 +10X_cells.AACTCCCAGTACACCT-L8TX_180406_01_F02,-0.044948537,-2.3862936 +10X_cells.CGTAGGCGTAGCACGA-L8TX_180406_01_F02,0.10420602,-2.685249 +10X_cells.GGTATTGGTCGCATCG-L8TX_180406_01_F02,0.3692218,-1.7416512 +10X_cells.CGTAGCGGTTCAGGCC-L8TX_180221_01_E09,-0.41307592,-2.7521338 +10X_cells.CTCACACCAAAGGAAG-L8TX_180221_01_C09,0.014447981,-0.25972188 +10X_cells.CGGTTAAGTTACGCGC-L8TX_180712_01_B06,-2.2379572,0.051909626 +10X_cells.TGGACGCCAAGGTGTG-L8TX_180712_01_B06,-0.1407278,-1.3182385 +10X_cells.TTGCGTCCAAGCTGTT-L8TX_180712_01_B06,0.36699313,-1.9268368 +10X_cells.CTCACACTCGGCTTGG-L8TX_181012_01_H04,-1.1133868,-2.2771733 +Smartseq_cells.SM-GE5VI_S187_E1-50,-1.0865469,-1.8896633 +10X_cells.AATCGGTTCAGCACAT-L8TX_180406_01_H01,0.6107567,-0.59443253 +10X_cells.TGTCCCACATTAGCCA-L8TX_180406_01_E07,-0.44655344,-1.1419222 +10X_cells.CTCGTCACACATAACC-L8TX_171026_01_F03,-0.9147298,-2.0352132 +10X_cells.CAGCTGGGTATGCTTG-L8TX_171026_01_A04,-0.42277405,-3.0410144 +10X_cells.TACCTATCAGCATACT-L8TX_171026_01_A05,-0.3218839,-3.1849399 +10X_cells.CTGTGCTTCGTAGGTT-L8TX_171026_01_F03,4.2757945,-2.873972 +10X_cells.CTTTGCGGTCGACTAT-L8TX_171026_01_F03,-1.8153979,-1.1600856 +10X_cells.TTCGGTCAGGCGTACA-L8TX_171026_01_G03,-0.11638572,-3.303777 +10X_cells.ACCCACTGTGAGGGAG-L8TX_171026_01_B04,-2.5878968,-0.19568415 +10X_cells.CAGCAGCAGGAATGGA-L8TX_171026_01_F04,-1.07771,-0.8357237 +10X_cells.CTCGGAGAGCAATATG-L8TX_171026_01_F04,-1.0702332,-1.6105866 +10X_cells.CGTCTACGTCTAGAGG-L8TX_171026_01_G04,-2.348179,-0.18923423 +10X_cells.CTTAGGATCGGAATCT-L8TX_171026_01_G04,-0.116772816,-1.8174137 +10X_cells.TCGAGGCAGGTACTCT-L8TX_171026_01_G04,-0.8853739,-2.1052325 +10X_cells.CCGGGATCACAGGAGT-L8TX_171026_01_B05,1.6118593,-2.117719 +10X_cells.TCGGGACTCCATGAAC-L8TX_171026_01_B05,-0.9309423,-1.8799859 +10X_cells.TGTATTCTCCTGCAGG-L8TX_171026_01_B05,-2.0659027,-0.21454608 +10X_cells.ACACCCTAGAAACGAG-L8TX_171026_01_H04,-2.4482715,0.15495616 +10X_cells.TAGTTGGTCTCAAACG-L8TX_171026_01_H04,-0.44006604,-2.9053767 +10X_cells.GCCAAATTCGGTCCGA-L8TX_171026_01_A05,-2.2149923,-0.7535571 +10X_cells.CTCGGAGAGTTCGCGC-L8TX_171026_01_D05,-0.8953873,0.16244863 +10X_cells.AACTGGTGTCAGAAGC-L8TX_171026_01_E05,-1.888216,0.10032945 +10X_cells.GGACAAGGTTAAAGTG-L8TX_171026_01_E05,-0.13356616,-3.2348251 +10X_cells.GTACGTATCATATCGG-L8TX_171026_01_E05,0.23388743,-1.6363934 +10X_cells.GACGTGCAGGGTATCG-L8TX_171026_01_F05,-1.075777,0.64988244 +10X_cells.TGAGAGGTCGGCTACG-L8TX_171026_01_G05,-1.0819608,-0.45308778 +10X_cells.TTAGGCAGTTCGTGAT-L8TX_171026_01_G05,-1.566463,-0.8193588 +10X_cells.ACAGCTATCCCACTTG-L8TX_171026_01_H05,-0.82655984,-0.37519944 +Smartseq_cells.LS-15538_S43_E1-50,-0.30824494,-2.7447875 +10X_cells.CAACCAATCGTAGGTT-L8TX_181206_01_A12,-1.8090488,-0.22571978 +10X_cells.TGCGCAGTCGTGGTCG-L8TX_181206_01_C12,-1.0538665,-0.07270766 +10X_cells.CGTCAGGCAACGATCT-L8TX_180406_01_E01,0.9939103,-0.098702855 +10X_cells.TGAGCCGAGCCAGAAC-L8TX_180406_01_C02,0.42573643,-0.27341792 +Smartseq_cells.SM-GE671_S052_E1-50,-0.9841513,-1.9293212 +Smartseq_cells.SM-GE671_S190_E1-50,-0.8350727,-1.2553656 +10X_cells.ACTTACTAGGCTCAGA-L8TX_180221_01_E10,-1.0021986,-0.73674583 +10X_cells.TGAGAGGGTCCTAGCG-L8TX_180221_01_E10,0.2781189,-1.673521 +10X_cells.ACGCCGAGTACATGTC-L8TX_180221_01_D10,-1.2322193,0.8011158 +10X_cells.AGAGCGATCTGCAAGT-L8TX_180221_01_D10,-0.17901729,-2.4515524 +10X_cells.CCTCAGTTCATGTCCC-L8TX_180221_01_E10,-1.0830188,0.64984846 +10X_cells.GCAATCATCGAATGGG-L8TX_180221_01_F10,-0.88122314,-0.2416544 +10X_cells.TTTGGTTGTTCATGGT-L8TX_180221_01_F10,-1.1198138,0.30016932 +10X_cells.CCACGGATCAGCAACT-L8TX_180221_01_G10,-1.4124968,0.79699814 +10X_cells.TCACGAAGTACTTAGC-L8TX_180221_01_G10,1.4277099,-0.7476878 +10X_cells.CTTAGGAGTTTAAGCC-L8TX_180221_01_H10,-1.4131509,0.1592852 +10X_cells.ACTTTCAAGCGTGTCC-L8TX_180221_01_A11,0.45527852,-1.0935744 +10X_cells.CGGACACGTTCGGCAC-L8TX_180221_01_A11,1.5040097,-1.5465796 +10X_cells.CTCACACCAAGGTGTG-L8TX_180221_01_A11,-0.44040537,0.40798703 +10X_cells.GACACGCTCTCGTTTA-L8TX_180221_01_A11,-0.7692936,-0.5120183 +10X_cells.CCTTCCCGTACCCAAT-L8TX_190312_01_B02,-1.440827,-1.3080612 +10X_cells.AGCGGTCAGGTCATCT-L8TX_190312_01_C02,-0.15071459,-2.2366796 +10X_cells.CATATTCGTGCCTTGG-L8TX_190312_01_D02,-2.0423405,0.45113602 +10X_cells.CGCTTCATCAGAGGTG-L8TX_180926_01_E12,-0.83763677,-3.2144346 +Smartseq_cells.SM-GE8XL_S104_E1-50,-1.8383021,-0.95312 +10X_cells.ACACCAATCAACGGCC-L8TX_190312_01_A03,-0.91179633,-2.0496757 +10X_cells.TCAGATGGTTCTCATT-L8TX_180926_01_B01,0.14490868,-2.4559507 +10X_cells.ATGAGGGCATGGTTGT-L8TX_180926_01_E01,-0.52085125,-0.47948432 +10X_cells.CGATGTAAGTCATGCT-L8TX_181011_01_A03,-1.2112378,-1.4019003 +10X_cells.GCGACCATCACCCGAG-L8TX_180712_01_F05,-0.12885763,-0.22746938 +10X_cells.ACTTTCACAAAGTCAA-L8TX_180712_01_E05,0.7210534,0.7331764 +10X_cells.TTTACTGTCTATCGCC-L8TX_180712_01_A06,0.4029062,-0.5689918 +10X_cells.CTGAAACGTTCGAATC-L8TX_180504_01_E01,-1.1777993,0.002855965 +10X_cells.CCTATTATCACCATAG-L8TX_180115_01_H10,-1.1569258,-2.264654 +10X_cells.CCACCTAGTCTCTCTG-L8TX_180115_01_D09,0.22900203,-1.6776395 +10X_cells.GCGCGATCATCCAACA-L8TX_180115_01_H10,-1.5895759,-0.6035384 +10X_cells.CGTTCTGTCTACGAGT-L8TX_180115_01_B11,-1.0314415,-0.7676172 +10X_cells.AACGTTGCACCCATGG-L8TX_180115_01_E11,-0.623579,0.49886084 +10X_cells.CTCGGAGAGGGATGGG-L8TX_180115_01_F11,-1.7818727,-0.43421406 +10X_cells.GCGCGATCAGCGTAAG-L8TX_180115_01_G11,-2.1083076,-0.80927014 +10X_cells.GGGTCTGTCCCGGATG-L8TX_180115_01_G11,-1.474305,-1.6256971 +10X_cells.GGGACCTCAGCAGTTT-L8TX_180115_01_G09,0.71182203,-1.0659474 +10X_cells.TCAGGTAGTATAAACG-L8TX_180115_01_G08,-2.375154,-0.24612348 +10X_cells.GATCTAGGTCACCTAA-L8TX_171120_01_C07,-0.3347327,-3.254073 +Smartseq_cells.LS-15078_S02_E1-50,-0.51589423,-2.9915454 +Smartseq_cells.SM-GE8ZW_S358_E1-50,-0.76420987,-2.180516 +10X_cells.AGGGATGTCAACCATG-L8TX_180221_01_F09,-2.0815363,0.82108307 +10X_cells.AGGGTGAAGCTGCCCA-L8TX_180221_01_G09,-2.0308268,1.4917178 +10X_cells.CGCTGGAAGAATTGTG-L8TX_180221_01_G09,-1.6642226,1.1756378 +10X_cells.TTGGAACGTCATGCAT-L8TX_180221_01_G09,-2.211063,0.94807047 +10X_cells.ACACCCTCAGATGGGT-L8TX_180221_01_A10,-2.113903,1.0525697 +10X_cells.CATTATCAGCTCCTCT-L8TX_180221_01_A10,-2.4783971,0.82693636 +10X_cells.TGTGGTATCGCACTCT-L8TX_180221_01_B10,0.08245756,-0.125075 +10X_cells.CACACAAAGGCCCGTT-L8TX_180221_01_C10,3.3034818,11.908541 +10X_cells.CCTACACCAATGACCT-L8TX_180221_01_D09,0.14956468,-0.61476725 +10X_cells.CTCAGAATCACCGTAA-L8TX_180221_01_H12,-1.2411512,0.8217627 +10X_cells.ATCGAGTTCAAGGTAA-L8TX_180221_01_E09,-1.9258734,0.15240212 +10X_cells.CTGGTCTGTTGCGTTA-L8TX_180221_01_E09,-1.1373042,-0.14502218 +10X_cells.GTAACGTTCCTATGTT-L8TX_180221_01_E09,-2.1349723,0.15199292 +10X_cells.TGCTGCTTCAGGCCCA-L8TX_180221_01_E09,3.1793516,12.162599 +10X_cells.CAAGTTGGTTCAGACT-L8TX_180712_01_C06,2.9988518,11.712113 +10X_cells.GTTACAGAGCAATCTC-L8TX_180829_01_D10,0.05030574,-0.20894647 +10X_cells.GACGTTACACACTGCG-L8TX_180907_01_F10,-2.1896288,-0.019076534 +10X_cells.ATAACGCAGGGATGGG-L8TX_181011_01_H02,-2.8323202,0.6890612 +10X_cells.GGGTTGCCAGCTGTTA-L8TX_181011_01_H02,-2.1848092,0.41176337 +10X_cells.CAAGAAAGTACAGACG-L8TX_181011_01_C04,-1.835207,-0.08804616 +10X_cells.CAGCTAAGTAAGTTCC-L8TX_180406_01_B06,-0.2679017,-0.39085808 +10X_cells.CACCACTTCCGATATG-L8TX_180406_01_E06,-0.28589374,1.4374069 +10X_cells.GTAGGCCAGGACGAAA-L8TX_180406_01_C08,0.76953274,0.684194 +Smartseq_cells.SM-GE91J_S015_E1-50,-1.707258,0.8839142 +10X_cells.GTTCGGGGTAGTGAAT-L8TX_200625_02_E11,3.9298012,9.2655115 +10X_cells.GTGGGTCAGGGCTCTC-L8TX_171026_01_G03,3.365271,11.101558 +10X_cells.AGTTGGTAGTGGAGAA-L8TX_171026_01_F03,-1.2124316,0.49915943 +10X_cells.CAACCAACAAGGTTTC-L8TX_171026_01_G03,-1.5944461,1.4250226 +10X_cells.CAACTAGAGATCACGG-L8TX_171026_01_G03,-2.3523262,0.89327264 +10X_cells.ATAAGAGGTTATTCTC-L8TX_171026_01_H04,-1.6926455,0.6069468 +10X_cells.GATCAGTCACACCGCA-L8TX_171026_01_H04,3.2890737,11.829851 +10X_cells.GAACGGAAGTGATCGG-L8TX_171026_01_H03,-0.74057114,0.24313754 +10X_cells.GAACGGATCGTTTATC-L8TX_171026_01_C05,-1.4971384,1.3545282 +10X_cells.GATCGATGTAAATACG-L8TX_171026_01_C05,-0.13453802,1.9254866 +10X_cells.TTGGAACTCAGCGACC-L8TX_171026_01_G05,3.4535234,10.894133 +Smartseq_cells.LS-15534_S71_E12-50,-2.2038877,-0.4313513 +Smartseq_cells.SM-GE92I_S209_E1-50,-2.1517806,-0.04050758 +10X_cells.TCTCATATCCGAACGC-L8TX_181206_01_B12,-1.8634139,1.0137154 +10X_cells.GCCTCTATCCGTAGGC-L8TX_181206_01_F12,-0.9512793,-0.048816565 +10X_cells.CTACCCACATGCCCGA-L8TX_180406_01_B02,3.6792107,8.55332 +10X_cells.AACTCAGTCCTAGGGC-L8TX_180406_01_B01,0.35186484,0.63917583 +10X_cells.GCTCTGTTCCTCGCAT-L8TX_180221_01_D10,3.0250957,10.855994 +10X_cells.TGACGGCTCCATTCTA-L8TX_180221_01_D10,-2.0372126,0.48464784 +10X_cells.ACGGAGAGTTGGTTTG-L8TX_180221_01_E10,-1.2447214,0.7459575 +10X_cells.CAGGTGCCAGGAACGT-L8TX_180221_01_E10,3.2669027,11.610465 +10X_cells.CTGATCCCAATGGATA-L8TX_180221_01_E10,-2.2164264,0.26437238 +10X_cells.GCATACATCATAACCG-L8TX_180221_01_F10,-1.2787539,0.15314949 +10X_cells.TACGGGCAGCCAGTAG-L8TX_180221_01_F10,-1.711807,0.67696816 +10X_cells.TGTGTTTAGTTGCAGG-L8TX_180221_01_F10,-0.81798923,-0.041235954 +10X_cells.GCTGCTTGTAGTACCT-L8TX_180221_01_G10,0.24463977,0.3497985 +10X_cells.CGGAGTCGTGATAAAC-L8TX_180221_01_H10,3.2337017,11.083327 +10X_cells.GATCGTACAGTATAAG-L8TX_180221_01_H10,1.5179935,-1.5160018 +10X_cells.GGATGTTCATGGTTGT-L8TX_180221_01_H10,-0.67326206,1.027331 +10X_cells.ATTATCCGTGAGCGAT-L8TX_180221_01_A11,-0.83968204,1.0740657 +10X_cells.CCCAGTTAGATACACA-L8TX_180221_01_A11,-2.1610947,1.2373426 +10X_cells.GCAGCCAGTAAGGGAA-L8TX_180221_01_A11,-1.3595294,0.2987203 +10X_cells.TACTCGCTCATGCTCC-L8TX_180221_01_A11,-1.7399737,0.8056696 +10X_cells.TAGAGCTAGCAAATCA-L8TX_180221_01_A11,-2.0063365,0.9440349 +10X_cells.AACTCCCGTCTTCGTC-L8TX_190312_01_B02,-1.8796501,0.8790313 +10X_cells.ATAAGAGAGCTACCTA-L8TX_190312_01_B02,0.16564052,1.3505269 +10X_cells.GTGAAGGAGATAGTCA-L8TX_190312_01_D02,-0.95207316,1.263826 +10X_cells.GTATCTTTCGGTTAAC-L8TX_190312_01_G02,-2.6502469,-0.8283784 +10X_cells.GGAAAGCTCAAACAAG-L8TX_180221_01_D11,-1.3078854,-0.6941721 +10X_cells.GACGTTAGTTAGTGGG-L8TX_180221_01_E11,-1.8701848,0.6186161 +10X_cells.TTTACTGGTAGCTCCG-L8TX_180907_01_B12,-0.31965318,1.7568069 +Smartseq_cells.SM-D9D8K_S64_E1-50,-2.3006597,0.23415084 +10X_cells.GGAAAGCTCTGAGTGT-L8TX_180926_01_D01,-0.7957468,-0.21783763 +10X_cells.CCTAGCTCACTAGTAC-L8TX_181011_01_A03,-1.5643773,0.14891586 +10X_cells.GCCTCTAAGATCCTGT-L8TX_181011_01_A03,-1.1228482,0.57950103 +10X_cells.TGGTTCCCACTACAGT-L8TX_181011_01_H03,-1.0116261,0.45922095 +Smartseq_cells.SM-GE91B_S027_E1-50,-1.152937,1.1010537 +10X_cells.CGCTATCCATATACGC-L8TX_180712_01_H05,-1.0930033,0.63214767 +10X_cells.CTGATCCAGTTCCACA-L8TX_180504_01_E01,-1.7180738,0.8293931 +10X_cells.ATCATCTTCTTCATGT-L8TX_180221_01_C12,-0.4697505,0.5430703 +10X_cells.GGACATTTCTCGAGTA-L8TX_180221_01_C12,-1.308255,0.5239919 +10X_cells.TGCTACCGTGCCTTGG-L8TX_180221_01_C12,-0.7513908,-0.08927768 +10X_cells.ACTATCTGTAGCTTGT-L8TX_180221_01_H11,0.44453895,-1.2447037 +10X_cells.GTGCGGTTCCATTCTA-L8TX_180115_01_E09,-2.0760202,-0.2785873 +10X_cells.TTGCGTCAGCAGGCTA-L8TX_180115_01_G11,3.873567,9.815003 +10X_cells.CTACCCAGTGACAAAT-L8TX_180115_01_B09,-1.309505,-0.16705836 +10X_cells.AAGGCAGTCTTGTACT-L8TX_180115_01_C09,0.08295471,-0.45974955 +10X_cells.TACGGGCAGATCCCGC-L8TX_180115_01_D09,-1.6777563,0.57071835 +10X_cells.TGGACGCGTAGGGACT-L8TX_180115_01_C10,-0.0911501,-0.38610616 +10X_cells.CAGCATAGTAGGAGTC-L8TX_180115_01_E10,-0.8804631,0.13968223 +10X_cells.GTCGGGTAGGCAATTA-L8TX_180115_01_E10,-0.7866776,0.24435085 +10X_cells.ATGAGGGCACAGCGTC-L8TX_180115_01_G10,-0.4218007,-0.39620465 +10X_cells.CCCATACGTCGCGTGT-L8TX_180115_01_G11,-0.7014565,1.6756254 +10X_cells.TCGCGAGTCGGTGTCG-L8TX_180115_01_H11,3.823673,12.059652 +10X_cells.GTGCAGCGTACATGTC-L8TX_171120_01_H07,-2.028236,1.1599519 +10X_cells.TGGACGCTCCCGGATG-L8TX_180115_01_H08,-2.6287742,0.03532697 +10X_cells.TACGGATCACGAAGCA-L8TX_180115_01_E08,-2.3799496,0.36961743 +Smartseq_cells.LS-15011_S80_E1-50,-2.1615858,0.62306476 +Smartseq_cells.LS-15069_S64_E1-50,-2.4338765,0.7134402 +Smartseq_cells.SM-D9CXQ_S69_E1-50,-1.8702474,-0.7261092 +Smartseq_cells.SM-GE66C_S136_E1-50,-2.2022252,1.1527103 +Smartseq_cells.SM-GE8ZL_S116_E1-50,-2.4013674,0.48312613 +Smartseq_cells.SM-GE67T_S020_E1-50,-2.5017033,-0.33234262 +Smartseq_cells.SM-GE92Z_S125_E1-50,-2.2843945,0.5631809 +10X_cells.ATCATCTGTGTAACGG-L8TX_180221_01_C10,14.829054,5.3133845 +10X_cells.ATCACGACATTTGCTT-L8TX_180221_01_F09,14.455731,5.6235766 +10X_cells.GTGTGCGTCTGTTGAG-L8TX_180221_01_A10,15.54426,4.1479583 +10X_cells.AACACGTAGGACTGGT-L8TX_180406_01_H01,12.868984,5.7937045 +10X_cells.AGGCCACCATGGTCTA-L8TX_180406_01_E07,12.115673,6.7543607 +10X_cells.CGTGTCTAGGATTCGG-L8TX_180406_01_E06,13.484247,4.956152 +Smartseq_cells.SM-GE91J_S304_E1-50,14.031611,6.278053 +10X_cells.CCGTACTTCCGCAAGC-L8TX_180221_01_G12,14.395328,5.615159 +10X_cells.AGTGTCAAGAAACGCC-L8TX_200625_02_G11,13.333145,1.9306757 +10X_cells.CTAACTTGTTTGTGTG-L8TX_180406_01_B02,13.702231,5.5373282 +10X_cells.AGTTGGTCACCAACCG-L8TX_180406_01_D02,13.653757,6.1159353 +10X_cells.GCACTCTTCAGGTAAA-L8TX_180406_01_E01,13.5072775,4.9487476 +10X_cells.TTATGCTGTCTTGTCC-L8TX_180406_01_G01,13.592328,5.060253 +10X_cells.CCACGGAAGGAATGGA-L8TX_180406_01_G01,13.961282,6.0372624 +10X_cells.ATGAGGGCATCTCCCA-L8TX_180406_01_G01,13.148549,4.5550785 +10X_cells.CGTGAGCGTAACGACG-L8TX_180406_01_E01,14.303095,5.6377783 +10X_cells.ACAGCTATCCTTTCTC-L8TX_180406_01_B01,13.92128,5.769451 +10X_cells.GGGATGAGTCCGTCAG-L8TX_180406_01_B02,13.141447,4.745609 +10X_cells.AGTAGTCTCTGTCAAG-L8TX_180406_01_B02,14.106295,6.0653286 +10X_cells.TCTGGAAGTGCCTGCA-L8TX_180406_01_C01,14.126219,6.0686083 +10X_cells.CGATGTAAGGTACTCT-L8TX_180406_01_E01,13.7028675,5.0508614 +10X_cells.TCCACACTCATCGGAT-L8TX_180406_01_B01,13.304886,4.738123 +10X_cells.CTGCCTACAGGGATTG-L8TX_180406_01_D01,14.312171,5.769885 +10X_cells.TAGTGGTGTTCTCATT-L8TX_180406_01_D02,13.8735,6.847539 +10X_cells.GGCTCGATCTACGAGT-L8TX_180406_01_C02,14.20018,5.938481 +10X_cells.TAGTTGGTCGGTTAAC-L8TX_180406_01_B01,13.4277,5.085271 +10X_cells.TTCTCAACACACCGCA-L8TX_180406_01_C01,13.826762,4.7591486 +10X_cells.CTAGCCTTCGAGAACG-L8TX_180406_01_E01,13.973425,5.2474747 +10X_cells.CGGGTCAGTCAGAATA-L8TX_180406_01_B01,13.218847,5.1864004 +10X_cells.CTCTACGCATCGATTG-L8TX_180406_01_B01,13.828641,6.0461745 +10X_cells.GTCTTCGAGATGCGAC-L8TX_180406_01_B01,13.476204,5.165091 +10X_cells.TTAGTTCTCGACAGCC-L8TX_180406_01_B01,13.780317,5.7454267 +10X_cells.GAATAAGGTTGCGTTA-L8TX_180406_01_C01,13.685181,5.117375 +10X_cells.GGCGTGTGTCCTCTTG-L8TX_180406_01_D01,13.97737,5.5968595 +10X_cells.AAATGCCAGCGGATCA-L8TX_180406_01_E01,13.746255,5.647898 +10X_cells.CTCAGAACAGATGAGC-L8TX_180406_01_G01,13.449863,5.0547724 +10X_cells.GAACCTACAGCCTGTG-L8TX_180406_01_G01,14.000955,5.80654 +10X_cells.TACGGGCAGCGCTCCA-L8TX_180406_01_G01,14.449707,5.7589955 +10X_cells.ATTACTCTCTCTAGGA-L8TX_180406_01_B02,13.717867,6.5184097 +10X_cells.CGGAGCTAGTCTTGCA-L8TX_180406_01_B02,13.337329,4.4880104 +10X_cells.GCTTCCACAGTCAGCC-L8TX_180406_01_B02,13.601581,4.6018987 +10X_cells.ACTGCTCCAAGGTTCT-L8TX_180406_01_C02,14.2007065,5.9016623 +10X_cells.CATCGGGTCTACCAGA-L8TX_180406_01_C02,13.332539,5.869158 +10X_cells.TACGGGCGTGATGTCT-L8TX_180406_01_C02,14.386397,6.172725 +10X_cells.TTGGCAATCTTCGGTC-L8TX_180406_01_C02,14.107602,4.5943727 +10X_cells.GATTCAGAGAGGTTAT-L8TX_180406_01_D02,13.706831,5.549865 +Smartseq_cells.SM-GE8Z7_S112_E1-50,14.925446,5.759277 +Smartseq_cells.SM-GE8Z7_S198_E1-50,15.550527,5.6512074 +10X_cells.GGCTCGAAGTAGGTGC-L8TX_180221_01_H10,14.446867,5.664842 +10X_cells.GGGCACTCACGTCAGC-L8TX_181012_01_B05,14.64998,5.486814 +10X_cells.CCAATCCAGCCTATGT-L8TX_180221_01_B11,14.0539055,1.4862138 +Smartseq_cells.SM-GE914_S080_E1-50,14.43084,6.4636273 +Smartseq_cells.SM-GE914_S269_E1-50,14.506386,5.9732623 +Smartseq_cells.SM-GE93M_S271_E1-50,15.389349,5.580983 +10X_cells.CACCAGGAGTATTGGA-L8TX_180115_01_F09,14.08166,2.4978826 +10X_cells.TCTCTAATCAAGGTAA-L8TX_180115_01_F08,17.603739,5.0939765 +10X_cells.CTCTAATTCTTGTACT-L8TX_171120_01_F07,15.621561,5.404172 +Smartseq_cells.LS-15007_S93_E1-50,15.897607,5.244335 +Smartseq_cells.LS-15078_S11_E1-50,16.134468,5.176361 +Smartseq_cells.SM-GE67X_S055_E1-50,15.169808,5.58379 +Smartseq_cells.SM-GE94L_S186_E1-50,14.813446,5.739234 +10X_cells.CAGCAGCCAGTCCTTC-L8TX_180406_01_E02,12.56966,7.100656 +Smartseq_cells.SM-GE91C_S163_E1-50,13.775056,8.674357 +10X_cells.GTCGTAAGTGATGCCC-L8TX_180406_01_F07,13.648898,8.602361 +10X_cells.CTCCTAGGTCCTGCTT-L8TX_200625_02_F11,10.485368,9.658839 +10X_cells.TGAGCCGCACCCTATC-L8TX_200625_02_F11,13.082707,8.943103 +10X_cells.AATCGGTCATCTACGA-L8TX_200625_02_G11,12.52329,5.1263356 +10X_cells.TGACGGCAGTATGACA-L8TX_200625_02_E11,13.059981,9.002098 +10X_cells.GGGCACTCATTTCAGG-L8TX_200625_02_G11,12.544137,4.5251474 +Smartseq_cells.SM-GE8ZQ_S241_E1-50,13.361623,8.850495 +Smartseq_cells.SM-GE8ZQ_S375_E1-50,13.027843,9.008372 +Smartseq_cells.SM-GE8ZS_S318_E1-50,13.4909,8.886483 +10X_cells.TTGCCGTAGCCATCGC-L8TX_180406_01_C01,13.283469,7.915654 +10X_cells.TGAGAGGTCGCAGGCT-L8TX_180406_01_G01,13.482392,5.9378333 +10X_cells.AACCGCGGTGTATGGG-L8TX_180406_01_E01,13.314369,5.847238 +Smartseq_cells.SM-GE915_S074_E1-50,13.749488,8.529416 +Smartseq_cells.SM-GE915_S274_E1-50,13.461591,8.471648 +Smartseq_cells.SM-GE91B_S053_E1-50,13.712897,8.71629 +Smartseq_cells.SM-GE93M_S170_E1-50,13.269382,8.585635 +10X_cells.AGCATACCACCAGCAC-L8TX_180406_01_B06,2.936212,1.1155347 +10X_cells.ACACCAACAAGTCTGT-L8TX_180406_01_B06,3.0703554,0.9713377 +10X_cells.CACCAGGAGCCCAATT-L8TX_180221_01_E12,13.686211,8.77571 +10X_cells.TATTACCGTAGGGACT-L8TX_200625_02_E11,14.087612,7.469326 +10X_cells.TAAGCGTAGCTAACTC-L8TX_200625_02_E11,14.02291,7.8815312 +10X_cells.CGTTCTGCAAGCCCAC-L8TX_180406_01_B01,13.827783,6.21111 +10X_cells.CGTTAGAAGTCAAGCG-L8TX_180406_01_B01,13.304878,4.7731304 +10X_cells.AGCGGTCAGTAACCCT-L8TX_180406_01_E01,13.361612,5.46691 +10X_cells.ACTTTCAGTTTGACAC-L8TX_180406_01_D02,13.59513,5.9655533 +10X_cells.ACGAGCCAGGAGCGTT-L8TX_180221_01_B11,13.884914,0.13326631 +Smartseq_cells.SM-GE915_S283_E1-50,13.723475,8.671122 +Smartseq_cells.SM-GE915_S354_E1-50,14.0090885,8.2041 +Smartseq_cells.SM-GE91B_S044_E1-50,13.895527,8.340626 +Smartseq_cells.SM-GE91B_S110_E1-50,14.078665,8.156582 +Smartseq_cells.LS-15029_S32_E1-50,15.899684,5.0410194 +10X_cells.ACACCAATCCGCAAGC-L8TX_180221_01_C10,18.083586,4.1982055 +10X_cells.TATTACCCAGGTCTCG-L8TX_180221_01_D09,14.932277,2.0334926 +10X_cells.ATCTGCCAGCCCTAAT-L8TX_180829_01_D10,17.392416,4.389161 +10X_cells.TACGGTACAGGGTTAG-L8TX_181012_01_G04,15.489231,1.435159 +10X_cells.AGTGTCAAGACCCACC-L8TX_171026_01_G04,18.308498,2.9765348 +10X_cells.CATGACAAGTAGCCGA-L8TX_171026_01_G04,18.327698,3.5808487 +10X_cells.CCCAGTTCACAACTGT-L8TX_171026_01_B05,17.974321,4.684007 +10X_cells.AAAGATGAGGAGTTGC-L8TX_171026_01_H03,16.586462,2.2586365 +10X_cells.CTACCCAAGTTACGGG-L8TX_171026_01_E05,16.507816,1.9749428 +10X_cells.AGCTCTCGTCGGCACT-L8TX_171026_01_F05,13.116516,2.6561217 +10X_cells.CTCATTATCCGCAAGC-L8TX_171026_01_G05,16.214998,5.6352305 +Smartseq_cells.LS-15395_S42_E1-50,17.528366,5.688807 +Smartseq_cells.SM-GE92I_S300_E1-50,18.48397,3.9825535 +10X_cells.TCAGGATTCTAACGGT-L8TX_181206_01_D12,16.45831,5.2369294 +10X_cells.TCGGGACCATGGTTGT-L8TX_181206_01_D12,17.839512,1.6754415 +Smartseq_cells.SM-GE66Y_S373_E1-50,18.272055,4.098016 +10X_cells.GCGCAACGTGACTACT-L8TX_180221_01_D10,18.237648,1.2854747 +10X_cells.CTTGGCTCAGTATCTG-L8TX_180221_01_A11,18.103354,4.55058 +10X_cells.GCCTCTATCCTTTCTC-L8TX_180907_01_B11,16.421274,1.9829451 +10X_cells.CAAGGCCCACGGTTTA-L8TX_181012_01_C05,16.742603,1.8408496 +Smartseq_cells.SM-GE8XK_S098_E1-50,18.533516,3.8071113 +10X_cells.ACTGCTCAGCGCCTCA-L8TX_180221_01_F11,14.649779,-1.3228784 +10X_cells.GCACTCTCAAGGTTTC-L8TX_190312_01_A03,17.41292,5.050545 +10X_cells.AGTGTCATCTTTACGT-L8TX_180712_01_H05,16.71715,2.1251452 +10X_cells.GCGCAGTGTGTTGAGG-L8TX_180712_01_H05,18.019585,4.1804132 +10X_cells.CCTTCGATCAAACAAG-L8TX_180115_01_D11,17.039293,-0.2557787 +10X_cells.GCTGCGACAAGCTGTT-L8TX_180115_01_C10,16.68319,2.5622177 +10X_cells.GACACGCGTCCTGCTT-L8TX_180115_01_D10,15.000457,0.84316355 +10X_cells.AACTCTTCACGAAAGC-L8TX_180115_01_A09,17.175007,2.2478764 +10X_cells.GGATTACCACACTGCG-L8TX_180115_01_B09,15.709059,1.5390184 +10X_cells.ACGCCGAAGACTAGGC-L8TX_180115_01_C09,17.101282,2.6075032 +10X_cells.ATTATCCAGCCACGTC-L8TX_180115_01_C09,17.053349,2.4453404 +10X_cells.TATTACCAGGGTCTCC-L8TX_180115_01_C09,16.779444,2.6273193 +10X_cells.GTCTTCGAGAGTGAGA-L8TX_180115_01_D09,15.788224,6.513421 +10X_cells.ACGATACAGAACTGTA-L8TX_180115_01_A11,17.362144,2.3142664 +10X_cells.ATTACTCGTTCCGTCT-L8TX_180115_01_H10,15.669224,1.5259906 +10X_cells.CACAAACGTTCCCGAG-L8TX_180115_01_H10,17.18342,2.6293435 +10X_cells.TAAGCGTTCGTGGACC-L8TX_180115_01_B10,16.508652,2.2606487 +10X_cells.CTGATAGTCATGCTCC-L8TX_180115_01_C10,15.690055,1.2584304 +10X_cells.TAAGCGTTCTGCGTAA-L8TX_180115_01_D11,17.181314,1.5678685 +10X_cells.CAAGGCCGTCTGATCA-L8TX_180115_01_E10,12.906209,3.4744866 +10X_cells.GAAGCAGTCGTTGCCT-L8TX_180115_01_F10,17.410269,2.5620933 +10X_cells.CCCATACGTGACTACT-L8TX_180115_01_G10,15.65174,1.601033 +10X_cells.TGATTTCCATACTCTT-L8TX_180115_01_F11,17.29574,4.3971763 +10X_cells.ACGTCAATCAACACCA-L8TX_180115_01_G11,17.056345,5.306718 +10X_cells.GCGCAGTCATTGCGGC-L8TX_180115_01_G11,17.10786,5.3372993 +10X_cells.ATCGAGTAGATGCGAC-L8TX_180115_01_H09,12.833614,5.272084 +10X_cells.GTTCTCGCATGTTGAC-L8TX_180115_01_E09,15.721192,0.82722807 +10X_cells.GATCGTAAGAACTCGG-L8TX_180115_01_F09,16.963873,2.5351384 +10X_cells.AAAGTAGTCACGCATA-L8TX_171120_01_G07,16.481169,2.3983178 +10X_cells.ATCGAGTTCGCGGATC-L8TX_171120_01_C07,15.619934,1.9963595 +10X_cells.CATCGAAAGACTTGAA-L8TX_171120_01_F07,17.519068,2.6500628 +10X_cells.GTTCGGGCATAGTAAG-L8TX_180115_01_C08,15.792933,1.4146608 +Smartseq_cells.LS-15069_S85_E1-50,17.54595,5.724376 +Smartseq_cells.LS-15078_S29_E1-50,17.484558,5.905597 +Smartseq_cells.LS-15580_S16_E1-50,18.537386,3.986619 +Smartseq_cells.SM-GE63I_S012_E1-50,17.957876,5.0735927 +Smartseq_cells.SM-GE67T_S053_E1-50,17.850357,5.2431254 +10X_cells.ATGAGGGCAGCGTTCG-L8TX_180221_01_F09,17.732458,4.425799 +10X_cells.GACTGCGGTGGCTCCA-L8TX_180221_01_B10,17.883974,5.286059 +10X_cells.TTCGAAGGTTTCCACC-L8TX_180221_01_B10,16.403229,5.259456 +10X_cells.AAAGATGCACTTCGAA-L8TX_180221_01_E09,17.325851,5.09532 +10X_cells.AAGGCAGCAGTAGAGC-L8TX_180221_01_E09,17.763819,4.5336337 +10X_cells.CTCGTACAGGGATACC-L8TX_180221_01_E09,17.728851,4.12688 +10X_cells.TCGTAGATCCCATTAT-L8TX_180221_01_E09,15.895414,5.873895 +10X_cells.CGAGAAGTCTCACATT-L8TX_180221_01_C09,16.92401,3.6290493 +10X_cells.CAAGTTGCAGTCAGCC-L8TX_180221_01_D09,13.102762,6.0849767 +10X_cells.GACTGCGAGCGCTTAT-L8TX_180221_01_D09,12.072269,6.7339067 +10X_cells.GCAATCAGTCTTTCAT-L8TX_180607_01_C05,15.328738,4.6897635 +10X_cells.GCTGCTTGTTTGTTTC-L8TX_180712_01_B06,17.351635,4.7926087 +10X_cells.CGCCAAGCAGCATGAG-L8TX_180712_01_C06,15.794847,6.33792 +10X_cells.TCGGTAAAGAGAGCTC-L8TX_180712_01_C06,15.792943,3.8945627 +Smartseq_cells.SM-GE67M_S277_E1-50,17.287724,5.438324 +Smartseq_cells.LS-15019_S10_E1-50,17.241837,6.0308685 +10X_cells.AGGCCGTGTCCGAATT-L8TX_180829_01_E10,13.169345,5.819928 +10X_cells.CCGTACTTCCACGCAG-L8TX_181011_01_H02,16.241497,7.0078936 +10X_cells.TGCACCTTCAGCTTAG-L8TX_181011_01_C04,15.710295,3.0509167 +10X_cells.CTAACTTCAGTATAAG-L8TX_181012_01_G04,15.711651,2.707792 +10X_cells.TCGTAGAGTATTAGCC-L8TX_181012_01_G04,17.129297,3.830585 +10X_cells.CATGACATCAACGCTA-L8TX_181012_01_H04,15.492012,4.4556355 +10X_cells.TCACGAATCCACGTGG-L8TX_181012_01_E05,15.779274,3.6551232 +10X_cells.TTTACTGGTTATGCGT-L8TX_180406_01_H02,16.171734,4.991279 +10X_cells.TACAGTGTCTCTGAGA-L8TX_180406_01_E07,12.902972,5.7682323 +10X_cells.ACTGAACTCTACTATC-L8TX_180406_01_B06,3.2858372,1.2832865 +10X_cells.GTCAAGTGTATAATGG-L8TX_180406_01_H02,12.524052,7.1271954 +10X_cells.ATTACTCAGTCAAGGC-L8TX_180406_01_H01,12.224623,7.0047216 +10X_cells.CCTACACGTACAAGTA-L8TX_180406_01_B06,12.503144,6.953932 +10X_cells.CCTTCCCGTCTCTCTG-L8TX_180406_01_H02,3.0729365,-0.8027763 +10X_cells.TCAATCTAGGACAGAA-L8TX_180406_01_H01,12.195775,6.692707 +10X_cells.CACAAACAGTGTTGAA-L8TX_171026_01_E05,17.038593,4.5536213 +10X_cells.CAGAATCCAAGTTAAG-L8TX_171026_01_F03,16.786316,7.3533587 +10X_cells.CTTAGGAGTCCAGTGC-L8TX_171026_01_G03,16.649496,6.5403547 +10X_cells.ATAACGCAGCGCCTCA-L8TX_171026_01_B04,17.455534,4.721886 +10X_cells.GATCGTAAGCCATCGC-L8TX_171026_01_H03,17.778488,3.542596 +10X_cells.CACATTTTCGGATGTT-L8TX_171026_01_A04,17.781181,4.9807353 +10X_cells.AGAGCTTCATTCGACA-L8TX_171026_01_C05,16.439621,5.761752 +10X_cells.TGAGGGAGTCTCCCTA-L8TX_171026_01_C05,17.01571,4.32154 +Smartseq_cells.SM-DD44N_S06_E1-50,17.656454,5.458969 +10X_cells.CGATGGCGTTAAGATG-L8TX_181206_01_E12,17.01854,3.3572335 +Smartseq_cells.SM-GE8ZH_S284_E1-50,18.069706,4.1078978 +10X_cells.AACTGGTAGGTGATAT-L8TX_180406_01_C01,13.523707,6.537983 +10X_cells.GCATACATCCACGTGG-L8TX_180406_01_E01,13.388365,6.9584155 +10X_cells.GACGCGTAGCTACCGC-L8TX_180406_01_B01,13.468164,6.2345557 +10X_cells.TGGTTAGTCACCCTCA-L8TX_180406_01_D01,13.100406,5.4060483 +Smartseq_cells.SM-GE8Z7_S200_E1-50,17.891693,4.383354 +10X_cells.GGATGTTGTAAGTAGT-L8TX_180221_01_G10,15.6272335,3.7993035 +10X_cells.TACTTACTCCGCTGTT-L8TX_180221_01_F10,16.013151,5.4501524 +10X_cells.CCTATTAGTCTCTTTA-L8TX_180221_01_G10,16.13474,5.422296 +10X_cells.ATCATCTGTTAAGAAC-L8TX_180221_01_D10,15.477764,3.5350957 +10X_cells.AGCGTCGCAAGCGATG-L8TX_180221_01_E10,16.23776,3.8932502 +10X_cells.CGTCACTCAAGCGTAG-L8TX_180221_01_F10,15.557028,3.897034 +10X_cells.GCAGCCATCCAAATGC-L8TX_180221_01_F10,16.66597,4.8559055 +10X_cells.CACAGGCTCTGCGTAA-L8TX_180221_01_H10,15.709363,3.2252517 +10X_cells.CCCAGTTTCAGTTAGC-L8TX_180221_01_A11,16.897652,4.337431 +10X_cells.GCTTCCACAAAGGCGT-L8TX_180907_01_B11,15.513901,2.9981585 +10X_cells.TGAAAGATCACCGGGT-L8TX_180907_01_B11,17.001734,3.0723948 +10X_cells.GCACTCTTCTGGTGTA-L8TX_180926_01_C12,17.718056,4.378941 +Smartseq_cells.SM-GE8XL_S002_E1-50,17.702274,5.4125156 +10X_cells.GACCTGGAGAGTGACC-L8TX_180221_01_E11,13.18287,5.658013 +10X_cells.GAGGTGATCTTGAGGT-L8TX_180221_01_G11,16.967113,6.3901753 +10X_cells.CAACTAGTCTTGCATT-L8TX_180907_01_A12,17.850008,5.1385818 +10X_cells.TAGACCACAGCTGGCT-L8TX_180907_01_B12,16.861826,5.5168867 +10X_cells.TTCTTAGAGTGCCAGA-L8TX_180907_01_B12,16.263193,2.1432917 +10X_cells.CACATTTCAGGCAGTA-L8TX_181011_01_H03,16.345522,5.3166237 +10X_cells.AACTTTCTCAGTTCGA-L8TX_180926_01_E01,15.627478,3.4710276 +10X_cells.GCTGCAGAGAATTGTG-L8TX_180926_01_E01,17.113798,3.3476532 +10X_cells.TAAACCGTCACAGGCC-L8TX_181011_01_A03,14.5084095,6.1426716 +Smartseq_cells.SM-GE914_S096_E1-50,16.680786,5.5961533 +10X_cells.TTAGGACGTTACAGAA-L8TX_180504_01_E01,12.737646,6.3742228 +10X_cells.AACTGGTCACATGTGT-L8TX_180712_01_H05,16.71037,4.2269964 +10X_cells.ACGCCGATCTTACCGC-L8TX_180712_01_H05,17.137009,3.8807757 +10X_cells.ATCACGAGTGTGCGTC-L8TX_180712_01_A06,16.154406,4.0115047 +10X_cells.GCAGTTATCACGAAGG-L8TX_180712_01_A06,15.766637,5.6698604 +10X_cells.CCGGGATCAAGCTGGA-L8TX_180504_01_E01,16.444992,5.1104517 +10X_cells.TGACTTTAGTGAAGAG-L8TX_180221_01_A12,16.221094,2.7065856 +10X_cells.CATTCGCTCGCACTCT-L8TX_180221_01_B12,12.975434,3.047173 +Smartseq_cells.SM-GE677_S177_E1-50,17.489168,4.556947 +10X_cells.ACTTTCACACTGTGTA-L8TX_180115_01_B09,17.121368,3.200476 +10X_cells.CAGTAACGTTCCACAA-L8TX_180115_01_C09,17.498072,4.3777947 +10X_cells.GAATAAGTCTGCAAGT-L8TX_180115_01_C09,17.342283,2.6422014 +10X_cells.TCTCTAAAGTGTGGCA-L8TX_180115_01_D09,17.816738,4.6113343 +10X_cells.CTCCTAGAGTGAACGC-L8TX_180115_01_A11,16.317047,4.995977 +10X_cells.ACTGATGAGCCTATGT-L8TX_180115_01_H10,17.193624,3.494508 +10X_cells.CCGTTCATCGCACTCT-L8TX_180115_01_H10,16.185415,6.44641 +10X_cells.TTAACTCTCGAGAGCA-L8TX_180115_01_H10,15.828257,2.039316 +10X_cells.TCTCATACACTGTTAG-L8TX_180115_01_B11,16.639025,2.91922 +10X_cells.AGTGAGGTCGCGATCG-L8TX_180115_01_C11,14.958223,5.8581057 +10X_cells.AACTCTTTCACGACTA-L8TX_180115_01_D11,16.587397,3.4668925 +10X_cells.CTAGTGAGTTTGTGTG-L8TX_180115_01_D11,16.82378,5.154769 +10X_cells.CCATTCGAGGGCTTCC-L8TX_180115_01_G10,13.312553,5.746346 +10X_cells.CTGCCTAGTCGCGAAA-L8TX_180115_01_G10,15.984166,1.8614078 +10X_cells.GGTGAAGAGTGGGTTG-L8TX_180115_01_G10,16.782705,3.0188823 +10X_cells.CGCCAAGGTCATGCCG-L8TX_180115_01_F11,16.47389,5.789845 +10X_cells.GGGACCTTCTGTCTCG-L8TX_180115_01_F11,17.65162,5.112415 +10X_cells.CTGGTCTGTAAGTAGT-L8TX_180115_01_H11,15.504746,4.1543612 +10X_cells.GACGTTATCCGCGCAA-L8TX_180115_01_H11,15.116356,2.4671054 +10X_cells.CTGATAGGTTCCAACA-L8TX_180115_01_A10,15.949836,2.338904 +10X_cells.TGGTTAGTCGAACGGA-L8TX_180115_01_E09,16.931278,2.340929 +10X_cells.TTCTCAATCGATGAGG-L8TX_180115_01_E09,15.595385,6.43213 +10X_cells.CACACAAGTCGAACAG-L8TX_180115_01_G09,16.255957,2.7998142 +10X_cells.ATCCGAACAGATAATG-L8TX_171120_01_C07,17.152866,6.431867 +10X_cells.CGCGGTATCATGCAAC-L8TX_180115_01_F08,17.16283,6.4132547 +10X_cells.CCTTCGACAACTGCTA-L8TX_180115_01_E08,16.86321,5.860924 +Smartseq_cells.SM-GE94L_S189_E1-50,17.730253,4.565588 +10X_cells.TTTATGCAGGGTTTCT-L8TX_180406_01_F02,14.307848,6.2775006 +10X_cells.GATCTAGCAGCTGCAC-L8TX_180712_01_B06,14.261639,7.511139 +10X_cells.TACAGTGAGCTCCTTC-L8TX_180221_01_E09,16.264154,7.3026004 +10X_cells.GAACATCGTAAGTTCC-L8TX_180221_01_C09,12.085976,6.520839 +10X_cells.ACGATACAGAAACGAG-L8TX_180221_01_C09,12.638758,6.692366 +10X_cells.CTAGTGACATTCACTT-L8TX_180221_01_H12,13.686929,6.8127246 +10X_cells.AGATCTGTCACTTATC-L8TX_180221_01_E09,14.492287,7.4034595 +10X_cells.TGTATTCTCATGTCTT-L8TX_180221_01_E09,14.239916,7.3986907 +10X_cells.GCTGCGAGTCATTAGC-L8TX_180221_01_C09,13.785278,7.1122246 +10X_cells.TTGCCGTGTGTTGAGG-L8TX_180221_01_C09,12.65178,6.41052 +10X_cells.GATTCAGCATTGGTAC-L8TX_180221_01_D09,12.151184,6.6475086 +10X_cells.ATCTGCCCAAGCCTAT-L8TX_180712_01_B06,12.7850895,5.8878026 +10X_cells.CACATTTGTGAGCGAT-L8TX_180712_01_B06,14.688491,7.4924 +10X_cells.CCTTCGAGTATAGGTA-L8TX_180712_01_B06,12.010378,6.29344 +10X_cells.GAATGAACAAATCCGT-L8TX_180712_01_B06,14.773285,6.5179996 +10X_cells.TTTGTCATCTTCATGT-L8TX_180712_01_B06,15.164232,6.612076 +Smartseq_cells.LS-15500_S38_E1-50,15.851055,7.651756 +10X_cells.TCTGAGAAGGAGTTGC-L8TX_180406_01_B06,15.772889,7.4772177 +10X_cells.CACATAGGTTCACGGC-L8TX_200625_02_G11,12.557474,8.183494 +10X_cells.TTTGTCAGTGCCTGGT-L8TX_171026_01_F05,14.138484,7.2833295 +10X_cells.CATTATCCACTGTCGG-L8TX_171026_01_A04,16.756424,7.817977 +10X_cells.ACGGGCTTCATAGCAC-L8TX_171026_01_G04,16.196188,7.574683 +10X_cells.TATCTCACATTGGTAC-L8TX_171026_01_A04,15.724319,7.5591726 +10X_cells.CTTAGGAGTCGGGTCT-L8TX_171026_01_F03,14.705553,7.224942 +10X_cells.TGTTCCGGTATGAAAC-L8TX_171026_01_G03,15.215489,7.6037855 +10X_cells.TAAACCGGTGCAGGTA-L8TX_171026_01_B04,15.29274,7.5205226 +10X_cells.TCACGAATCTTGCATT-L8TX_171026_01_B04,16.634926,7.9182816 +10X_cells.TCTTCGGAGAGAACAG-L8TX_171026_01_B04,15.468274,7.5387006 +10X_cells.GAGTCCGGTGTCAATC-L8TX_171026_01_F04,15.977118,7.3191104 +10X_cells.TTATGCTCACTATCTT-L8TX_171026_01_F04,16.636896,7.69257 +10X_cells.CGTGTAACAATCTACG-L8TX_171026_01_G04,15.8937235,7.7239127 +10X_cells.GTCATTTAGACTACAA-L8TX_171026_01_G04,11.257713,6.094204 +10X_cells.CACCACTGTATTCTCT-L8TX_171026_01_B05,12.7476425,6.2817397 +10X_cells.TCAGCAAAGTCGTTTG-L8TX_171026_01_H04,16.717503,7.8783374 +10X_cells.AACCGCGAGATATGCA-L8TX_171026_01_A05,16.791893,7.8455067 +10X_cells.AACACGTGTGTGAAAT-L8TX_171026_01_H03,16.452652,7.697779 +10X_cells.CATATTCCAGGTGCCT-L8TX_171026_01_C05,15.356622,7.275768 +10X_cells.TGGTTAGGTATGGTTC-L8TX_171026_01_C05,15.339977,7.3580084 +10X_cells.ACACTGAAGCGGATCA-L8TX_171026_01_D05,13.712856,6.570042 +10X_cells.TACTTACAGACACTAA-L8TX_171026_01_E05,16.536623,7.371082 +10X_cells.TTCCCAGCAACACGCC-L8TX_171026_01_H05,14.74819,7.3623066 +Smartseq_cells.SM-GE935_S282_E1-50,15.898514,6.680546 +10X_cells.CCCAATCCACTAAGTC-L8TX_180406_01_B02,13.421288,7.254907 +10X_cells.GAATGAAGTAATAGCA-L8TX_180406_01_D02,12.557757,6.976882 +10X_cells.CAGTCCTTCGAACTGT-L8TX_180221_01_F10,11.81335,6.0173464 +10X_cells.ACACCGGAGTTAACGA-L8TX_180221_01_D10,12.64842,6.0253167 +10X_cells.TAGGCATTCGCCTGAG-L8TX_180221_01_E10,14.01433,7.5345335 +10X_cells.AAATGCCGTGCGAAAC-L8TX_180221_01_D10,14.656674,7.3903084 +10X_cells.CGCCAAGGTTTGGGCC-L8TX_180221_01_D10,14.281733,7.368764 +10X_cells.CTACCCAAGGGTATCG-L8TX_180221_01_G10,14.777849,6.4782786 +10X_cells.ACACCCTGTGTGGTTT-L8TX_180907_01_B11,13.269198,6.138609 +10X_cells.ATAAGAGGTACCGGCT-L8TX_180907_01_B11,12.113973,5.5029073 +10X_cells.AGTAGTCTCTCGAGTA-L8TX_180926_01_F01,16.684683,7.6194377 +10X_cells.CTGAAGTCATTGTGCA-L8TX_180926_01_B01,13.702919,6.382881 +10X_cells.GATGAGGAGTCGAGTG-L8TX_180926_01_D01,16.277077,7.1926208 +10X_cells.GCTTGAAAGCTACCGC-L8TX_180926_01_E01,12.40531,6.288578 +10X_cells.TTAACTCGTAAATACG-L8TX_181011_01_A03,12.129819,6.519088 +10X_cells.CACCAGGGTCAGCTAT-L8TX_181011_01_H03,13.906776,6.806783 +10X_cells.TCTTCGGAGGGTCTCC-L8TX_180221_01_H11,11.84632,5.54389 +10X_cells.CTCGTACAGATGTTAG-L8TX_180712_01_A06,14.242029,7.226825 +10X_cells.TCATTTGGTAGGGTAC-L8TX_180712_01_A06,14.230188,6.432596 +10X_cells.TGAGCATCAGGATTGG-L8TX_180712_01_A06,14.238393,7.066712 +10X_cells.GTCTCGTTCGTTGCCT-L8TX_180504_01_E01,14.149729,6.4703054 +10X_cells.TGACAACCAGCGTCCA-L8TX_180221_01_A12,11.917296,6.0631022 +Smartseq_cells.SM-GE679_S186_E1-50,16.160368,7.2977653 +10X_cells.GTTCTCGTCTCCAGGG-L8TX_180115_01_E09,14.817071,6.916617 +10X_cells.CCCTCCTGTCAAACTC-L8TX_180115_01_D10,13.4941435,6.015731 +10X_cells.AGTCTTTGTAGCAAAT-L8TX_180115_01_C11,13.290872,6.473184 +10X_cells.CGCTGGATCGTTACGA-L8TX_180115_01_A10,14.791694,6.518834 +10X_cells.GATGAAATCTTACCTA-L8TX_171120_01_H07,15.856272,6.9408617 +10X_cells.CCATGTCCACCAGATT-L8TX_180115_01_H08,15.981216,7.114005 +Smartseq_cells.LS-14692_S75_E1-50,15.254079,7.4945965 +Smartseq_cells.LS-15085_S29_E1-50,16.69007,7.058089 +Smartseq_cells.SM-DD45K_S177_E1-50,16.704155,6.694182 +10X_cells.GCGACCATCGGCGGTT-L8TX_180406_01_C06,11.882039,5.8512974 +10X_cells.TAGGCATCATTCTCAT-L8TX_180712_01_G05,15.778357,6.2492 +10X_cells.TCAGATGCATGGGAAC-L8TX_180829_01_D09,13.839045,6.0729737 +10X_cells.ACCTTTATCAAGGCTT-L8TX_180829_01_E10,13.491963,6.1567473 +10X_cells.GTTCATTAGCTGTTCA-L8TX_180829_01_E10,12.670759,5.7745857 +10X_cells.CTGGTCTTCGTATCAG-L8TX_181011_01_C04,12.242134,5.6365557 +10X_cells.TTGACTTGTCGACTAT-L8TX_171026_01_G03,15.780238,6.3125887 +10X_cells.TTGGAACGTGTGTGCC-L8TX_171026_01_F04,14.213662,6.809068 +10X_cells.ACTTTCAGTTACGACT-L8TX_171026_01_C05,14.603692,6.4266415 +10X_cells.TAAGCGTTCATTCACT-L8TX_171026_01_C05,14.239412,6.5524735 +10X_cells.AGCGTCGCAGGACGTA-L8TX_180221_01_G10,10.135042,6.062116 +10X_cells.CGGACACCATTTGCCC-L8TX_190312_01_G02,13.31204,5.8051696 +10X_cells.CGTGAGCGTCAGTGGA-L8TX_181012_01_C05,12.070935,5.4880023 +10X_cells.GTTCGGGGTGACTCAT-L8TX_180221_01_D11,16.070778,0.4511634 +10X_cells.ATCCACCCAGGGATTG-L8TX_180907_01_A12,10.882972,4.9754167 +10X_cells.CATCGGGAGGCGCTCT-L8TX_180907_01_A12,15.488129,7.2014027 +Smartseq_cells.LS-15396_S40_E1-50,15.913633,7.039208 +10X_cells.CGGTTAAAGGGTATCG-L8TX_180926_01_F01,14.358773,6.311486 +10X_cells.GCCTCTATCTGTCCGT-L8TX_180221_01_C12,14.515914,7.1675444 +10X_cells.GGGTTGCCAGCCTATA-L8TX_180115_01_F09,13.095938,6.0304866 +10X_cells.CCCTCCTGTTACGACT-L8TX_180115_01_B09,12.447997,5.7297416 +10X_cells.AGCCTAATCTGCGACG-L8TX_180115_01_D09,15.210065,6.2006946 +10X_cells.GGTGTTATCTCGATGA-L8TX_180115_01_H10,12.973557,5.597136 +10X_cells.GTGCTTCAGACAGGCT-L8TX_180115_01_D11,11.290799,5.698551 +10X_cells.AAACGGGTCCCTCAGT-L8TX_180115_01_F10,15.934139,5.3510346 +10X_cells.AACACGTTCCAATGGT-L8TX_180115_01_G11,14.585192,6.5589657 +10X_cells.AGCGTATTCATTATCC-L8TX_180115_01_H09,12.032264,5.6876993 +10X_cells.TTCCCAGAGCAGCGTA-L8TX_180115_01_A10,11.892566,5.4671884 +10X_cells.CGCTATCCACCTGGTG-L8TX_171120_01_D07,14.7195015,6.9314127 +10X_cells.AGGCCACGTCGCATCG-L8TX_171120_01_E07,14.686092,5.900106 +10X_cells.TCGCGAGTCTGCAAGT-L8TX_180115_01_C08,13.957055,5.789842 +Smartseq_cells.LS-14692_S63_E1-50,15.484044,6.874499 +Smartseq_cells.LS-15004_S59_E1-50,15.500348,6.8301654 +Smartseq_cells.LS-15015_S21_E1-50,15.732549,6.635415 +Smartseq_cells.LS-15077_S15_E1-50,14.9486475,6.9333467 +Smartseq_cells.LS-15080_S43_E1-50,15.459654,6.5443335 +Smartseq_cells.SM-DD45K_S163_E1-50,15.269262,6.6219115 +10X_cells.GACGCGTGTTGGAGGT-L8TX_180406_01_H01,11.888026,7.799646 +10X_cells.GCAAACTAGGTGCTAG-L8TX_180406_01_H01,11.344175,7.8010354 +10X_cells.AAGACCTCAATGACCT-L8TX_180406_01_G02,12.578802,7.841921 +10X_cells.GGGATGAGTATAGGTA-L8TX_180406_01_B06,11.614673,7.345513 +10X_cells.CTCAGAAGTTCGTTGA-L8TX_180406_01_C08,11.464425,7.4677014 +10X_cells.TTTACTGTCCGAGCCA-L8TX_180406_01_C08,11.282396,7.6277037 +10X_cells.CTTCTCTAGGAATCGC-L8TX_180406_01_C07,11.594276,7.763251 +10X_cells.AGATCTGCATCGACGC-L8TX_180406_01_G02,12.47779,7.1131716 +10X_cells.CACACTCAGGTGCAAC-L8TX_180406_01_E06,11.743873,7.154657 +10X_cells.TGCACCTTCAGTCCCT-L8TX_180406_01_E02,12.178112,7.0225434 +10X_cells.CATTATCGTTCCACGG-L8TX_180406_01_C07,12.093577,7.223885 +10X_cells.TCAGCAACATCCCATC-L8TX_200625_02_F11,12.393295,8.229607 +10X_cells.TGTCCCAAGCTGCGAA-L8TX_200625_02_G11,12.782595,7.997189 +Smartseq_cells.SM-GE8ZQ_S033_E1-50,12.944862,7.8411145 +10X_cells.CGTCTACTCATTGCGA-L8TX_180406_01_E01,12.824018,7.277928 +10X_cells.GGGTCTGTCCCTCAGT-L8TX_180406_01_B02,11.683715,7.233862 +10X_cells.AACTTTCGTTAGAACA-L8TX_180406_01_B01,11.747365,7.1769814 +10X_cells.AAAGATGGTATTCGTG-L8TX_180406_01_F01,11.948149,7.1769075 +10X_cells.TATTACCCAGTAAGAT-L8TX_180406_01_D02,12.238135,7.11903 +Smartseq_cells.SM-GE915_S183_E1-50,15.427874,7.512157 +10X_cells.ACCGTAAGTACCGGCT-L8TX_180221_01_F09,3.5432403,-2.851544 +10X_cells.GTTACAGGTTCGTGAT-L8TX_180221_01_G09,4.4834347,-3.1514294 +10X_cells.ACGTCAATCTGTCAAG-L8TX_180221_01_H09,15.7613945,-0.2424924 +10X_cells.CTCGGGATCTCTAAGG-L8TX_180221_01_H09,3.4049914,-2.558664 +10X_cells.CTCCTAGAGCAACGGT-L8TX_180221_01_A10,2.8039603,-1.6910387 +10X_cells.GGACAAGGTCATGCAT-L8TX_180221_01_A10,3.4761071,-3.0080504 +10X_cells.GTCATTTAGGTTCCTA-L8TX_180221_01_A10,1.7832543,0.872995 +10X_cells.TACTCGCAGGACATTA-L8TX_180221_01_A10,5.3620324,-2.5285003 +10X_cells.ACATACGGTACGACCC-L8TX_180221_01_B10,3.2306218,-2.6310225 +10X_cells.AGCAGCCGTTCGCTAA-L8TX_180221_01_B10,3.853534,-2.8942783 +10X_cells.GTTCGGGGTCAAACTC-L8TX_180221_01_B10,7.4594927,-2.9562082 +10X_cells.TTCTTAGAGTTAGGTA-L8TX_180221_01_B10,3.5424736,0.488144 +10X_cells.GCCTCTAGTGATGTCT-L8TX_180221_01_C10,3.5367286,-2.3761861 +10X_cells.GGGTTGCCAGGGCATA-L8TX_180406_01_F02,6.3257985,-2.8905315 +10X_cells.GTGTGCGTCCTTTACA-L8TX_180406_01_F02,2.2571266,-0.3134358 +Smartseq_cells.SM-GE63J_S307_E1-50,3.9300182,-3.1534026 +Smartseq_cells.SM-GE63L_S155_E1-50,3.5370307,-2.762841 +10X_cells.ACGGGCTTCTCAAACG-L8TX_180712_01_B06,3.2323763,-2.5331717 +10X_cells.AGTGTCATCAGTCAGT-L8TX_180221_01_C09,4.391705,-2.5045996 +10X_cells.CGGCTAGAGTACCGGA-L8TX_180712_01_B06,4.3768926,-1.605571 +10X_cells.GAATGAATCTTGAGAC-L8TX_180712_01_G05,5.2533293,-2.4892783 +10X_cells.CCCAATCTCTGGCGTG-L8TX_180221_01_E09,3.0531237,-0.030870788 +10X_cells.GGCTCGACAGCGATCC-L8TX_180221_01_E09,4.939791,-3.534406 +10X_cells.AAAGATGCATATGGTC-L8TX_180221_01_C09,4.054142,-1.7569 +10X_cells.CACCTTGGTCCAGTTA-L8TX_180221_01_C09,4.016057,-2.574026 +10X_cells.CGGTTAATCGTTACGA-L8TX_180221_01_C09,4.3933434,-1.9335815 +10X_cells.CTGAAGTTCCCAGGTG-L8TX_180221_01_C09,3.4335594,-0.4931251 +10X_cells.GCGCAGTAGAGAACAG-L8TX_180221_01_C09,13.426793,2.015643 +10X_cells.TTAACTCCAAACGTGG-L8TX_180221_01_C09,3.511448,-1.3954864 +10X_cells.GAACATCGTCTCTCGT-L8TX_180221_01_D09,3.9536254,-0.27543584 +10X_cells.GTCAAGTCACGCCAGT-L8TX_180221_01_D09,3.399586,-1.1742367 +10X_cells.TCCACACAGCGAAGGG-L8TX_180221_01_D09,4.1135,-1.5922606 +10X_cells.TTCGAAGGTTCAGCGC-L8TX_180221_01_D09,3.5219395,-0.33709288 +10X_cells.GAAGCAGAGCAGATCG-L8TX_180607_01_C05,4.7105403,-2.6595275 +10X_cells.CAGAGAGGTATAGGTA-L8TX_180712_01_G05,5.4797916,-3.630155 +10X_cells.CCCTCCTTCCATGCTC-L8TX_180712_01_G05,3.0375736,-2.2634351 +10X_cells.CGCGTTTTCGGAGGTA-L8TX_180712_01_G05,3.850524,-1.5196363 +10X_cells.GCATACACAGTCAGAG-L8TX_180712_01_B06,5.2011695,-3.7416334 +10X_cells.TCTGAGACAACGATGG-L8TX_180712_01_B06,4.4011135,-2.6232638 +10X_cells.TCACAAGTCATGTAGC-L8TX_180712_01_C06,3.8060362,-2.073899 +10X_cells.TGGTTCCGTGAACCTT-L8TX_180712_01_C06,2.9620178,-1.0067132 +Smartseq_cells.LS-15014_S02_E1-50,5.1983023,-3.3193297 +Smartseq_cells.LS-15035_S19_E1-50,10.943072,-4.1241035 +Smartseq_cells.LS-15325_S92_E2-50,4.616755,-3.3288393 +Smartseq_cells.LS-15326_S40_E1-50,5.6920533,-3.019905 +Smartseq_cells.LS-15372_S05_E1-50,5.0644536,-3.5546732 +Smartseq_cells.LS-15387_S32_E1-50,5.4092684,-2.910299 +Smartseq_cells.LS-15500_S48_E1-50,4.8847976,-2.3016765 +Smartseq_cells.LS-15515_S39_E1-50,5.100225,-3.6033397 +10X_cells.CGAATGTAGCGTTTAC-L8TX_180829_01_D10,3.0333705,-0.2890502 +10X_cells.ATCGAGTTCCACTCCA-L8TX_181011_01_G02,2.076952,-0.2052595 +10X_cells.TCGGTAAGTATGAAAC-L8TX_180829_01_D09,3.9802964,-2.0899642 +10X_cells.CTACACCCAGGGTTAG-L8TX_180829_01_D10,5.2082715,-2.9282706 +10X_cells.GGGCATCCACTGCCAG-L8TX_180829_01_D10,4.5123262,-0.3019288 +10X_cells.TAGGCATAGCTCAACT-L8TX_180907_01_F10,3.1206763,-0.95923173 +10X_cells.CGATGGCAGCGATCCC-L8TX_180907_01_G10,2.5486553,-0.7644338 +10X_cells.GCAGTTAGTACATGTC-L8TX_181011_01_C04,3.5712516,-0.19138965 +10X_cells.TATCTCATCGACGGAA-L8TX_181012_01_G04,2.9498243,-0.6407849 +10X_cells.GGTATTGAGCTAAACA-L8TX_181012_01_E05,4.0344887,-2.0013056 +10X_cells.TGAGAGGCAGCATGAG-L8TX_181012_01_E05,4.9762444,-2.0315518 +10X_cells.AAGGTTCCATCGGTTA-L8TX_180406_01_H01,3.2954118,-1.4116209 +10X_cells.ATTTCTGTCTCGTATT-L8TX_180406_01_H01,2.5578365,0.25711313 +10X_cells.GGGAATGTCACGATGT-L8TX_180406_01_B06,2.2913885,1.1905048 +10X_cells.AAGCCGCCATTCCTCG-L8TX_180406_01_C08,2.7483425,-0.24430141 +10X_cells.AAGCCGCTCCTCGCAT-L8TX_180406_01_C07,12.181448,6.2394733 +10X_cells.GCTTGAAAGCCGCCTA-L8TX_180406_01_C07,2.9677806,-0.57450104 +10X_cells.GTCCTCACAAGTAGTA-L8TX_180406_01_C07,2.9348285,-0.020002278 +10X_cells.GCTTGAATCACTGGGC-L8TX_180406_01_H01,2.8715787,-0.5115242 +10X_cells.GGTGCGTGTTATCACG-L8TX_180406_01_E02,5.0636554,-2.3114142 +10X_cells.CGAGCCATCTCTTGAT-L8TX_180406_01_B06,3.355459,-1.2913574 +10X_cells.TGTATTCTCCGCTGTT-L8TX_180406_01_E06,8.40343,2.5474105 +10X_cells.CTGCCTATCTATCCCG-L8TX_180406_01_C08,3.6192815,0.13164115 +10X_cells.TCGGTAACATCTCGCT-L8TX_180406_01_C08,4.248684,1.1305988 +10X_cells.AGGTCCGAGTCCAGGA-L8TX_180406_01_C07,3.7097332,-0.59929186 +10X_cells.ATCACGAGTTTGACAC-L8TX_180406_01_C07,3.368926,-1.2474597 +10X_cells.CCAGCGAGTGTAATGA-L8TX_180406_01_C07,4.2969117,-1.923508 +10X_cells.GGACATTGTAAATGTG-L8TX_180406_01_C07,3.129068,-1.3483036 +10X_cells.TGCCCTAGTAAATACG-L8TX_180406_01_C07,3.1402712,0.8394694 +Smartseq_cells.SM-GE91L_S245_E1-50,6.2595606,-3.462713 +10X_cells.TACTTACGTACAGTGG-L8TX_200625_02_G11,12.463253,4.5899286 +10X_cells.AGCTCCTAGTGTTTGC-L8TX_180406_01_B08,4.9998097,-2.8623955 +Smartseq_cells.SM-GE65S_S331_E1-50,6.0828085,-3.314677 +10X_cells.GGCGACTCAAGGTGTG-L8TX_171026_01_H03,6.358844,-2.6219401 +10X_cells.GGCGACTTCCAAAGTC-L8TX_171026_01_E05,3.3395784,-0.79036474 +10X_cells.ATCTACTGTCGAATCT-L8TX_171026_01_F04,4.7666693,-3.1381037 +10X_cells.TTGACTTAGCGATAGC-L8TX_171026_01_A04,3.221141,-1.1268818 +10X_cells.AGCGTATTCTGTGCAA-L8TX_171026_01_F03,4.7323685,-2.1909683 +10X_cells.ATCACGATCAATAAGG-L8TX_171026_01_F03,8.04378,-3.5457485 +10X_cells.AGGCCACGTGCAACGA-L8TX_171026_01_G03,17.726234,3.8133345 +10X_cells.CTACACCAGGGAACGG-L8TX_171026_01_G03,4.9802732,-3.5810215 +10X_cells.GTATCTTTCCCGACTT-L8TX_171026_01_G03,3.0507765,-2.5207057 +10X_cells.ATCTACTCAGGAACGT-L8TX_171026_01_B04,8.471902,-3.2951257 +10X_cells.GAAATGACAAGCGAGT-L8TX_171026_01_B04,5.0637603,-2.8815224 +10X_cells.CACCACTTCAGCTGGC-L8TX_171026_01_F04,6.0497136,-3.1773098 +10X_cells.CGAATGTTCACCCTCA-L8TX_171026_01_F04,3.194484,-2.454067 +10X_cells.ACATGGTGTGCATCTA-L8TX_171026_01_G04,5.044188,-2.5398011 +10X_cells.CACTCCACACTACAGT-L8TX_171026_01_G04,3.229328,-2.4966402 +10X_cells.CGGAGTCCACGACTCG-L8TX_171026_01_G04,4.987911,-3.3726833 +10X_cells.AGAGCGAAGTGGGTTG-L8TX_171026_01_B05,5.516342,-3.0226705 +10X_cells.GAAGCAGTCCAGAAGG-L8TX_171026_01_B05,4.9520426,-3.2805724 +10X_cells.ACACCCTAGATATACG-L8TX_171026_01_H04,5.5299296,-3.4554145 +10X_cells.AAAGCAATCACTCTTA-L8TX_171026_01_A05,2.9486697,-2.3075006 +10X_cells.GACGTTAGTACAAGTA-L8TX_171026_01_A05,5.8332253,-2.849375 +10X_cells.GGAATAAAGACAAAGG-L8TX_171026_01_A05,5.450001,-3.2729776 +10X_cells.TCGCGAGGTAGGACAC-L8TX_171026_01_A05,18.428373,3.2690637 +10X_cells.CGAGAAGAGCGTAGTG-L8TX_171026_01_H03,12.494916,-2.348867 +10X_cells.GGAACTTCACATTCGA-L8TX_171026_01_H03,5.994993,-2.3479505 +10X_cells.TTAACTCAGCGTTCCG-L8TX_171026_01_H03,5.6025777,-2.0327184 +10X_cells.CATTCGCCATAGTAAG-L8TX_171026_01_A04,5.3632545,-3.4589992 +10X_cells.CGGTTAATCCTACAGA-L8TX_171026_01_A04,6.098662,-3.2733524 +10X_cells.GTCACGGTCCACGACG-L8TX_171026_01_A04,3.7916744,-3.2980208 +10X_cells.TCGCGTTCAGCGTTCG-L8TX_171026_01_A04,6.4844007,-3.2475867 +10X_cells.GAATGAATCTCCGGTT-L8TX_171026_01_C05,3.6246982,-1.1414992 +10X_cells.CGCTGGATCCTGCAGG-L8TX_171026_01_D05,8.525618,-3.9170465 +10X_cells.CTCACACAGAAACCTA-L8TX_171026_01_D05,4.319542,-2.2565062 +10X_cells.TGCACCTAGCACCGTC-L8TX_171026_01_D05,2.5737746,-0.5799171 +10X_cells.GATCGCGAGAATTGTG-L8TX_171026_01_E05,17.49346,3.5311773 +10X_cells.GGCCGATGTGCTAGCC-L8TX_171026_01_E05,3.597502,-0.76478696 +10X_cells.GGAGCAAGTGGAAAGA-L8TX_171026_01_F05,10.400419,-4.2483816 +10X_cells.TACTTGTAGATCGGGT-L8TX_171026_01_F05,3.560929,-0.51824313 +10X_cells.TCGTAGATCCACGAAT-L8TX_171026_01_F05,9.4860935,-3.4494858 +10X_cells.ACTTGTTTCGTGGGAA-L8TX_171026_01_G05,3.1656494,0.6185221 +10X_cells.CATGACACACTATCTT-L8TX_171026_01_G05,5.0992327,-2.9182053 +10X_cells.GTACTCCAGCGTCTAT-L8TX_171026_01_H05,6.63564,-3.355709 +Smartseq_cells.LS-15533_S33_E12-50,4.8956237,-3.2736707 +Smartseq_cells.SM-GE92H_S144_E1-50,5.3138065,-3.5311031 +Smartseq_cells.SM-GE92I_S171_E1-50,5.761661,-3.4116066 +10X_cells.TTGAACGAGGAATTAC-L8TX_181206_01_F12,3.1853867,-0.30832157 +10X_cells.CTAAGACAGCGTAGTG-L8TX_181206_01_F12,4.2350836,-1.0472237 +10X_cells.ACACCGGAGCGATAGC-L8TX_181206_01_H11,6.528756,-3.3282986 +10X_cells.AGTGAGGGTTAAGAAC-L8TX_181206_01_B12,3.3900151,0.37610382 +10X_cells.AGTGGGAGTAGCTAAA-L8TX_181206_01_B12,4.5384994,-2.1716044 +10X_cells.CACACAAGTGTTGAGG-L8TX_181206_01_C12,3.4870286,-0.27523184 +10X_cells.GCTGCAGCATCCAACA-L8TX_181206_01_D12,3.9785755,-1.6189542 +10X_cells.TGAGAGGTCAGCAACT-L8TX_181206_01_D12,5.7619777,-2.5910468 +10X_cells.ACGTCAATCAACACAC-L8TX_181206_01_F12,4.0771127,-2.2442012 +10X_cells.CTAAGACTCTAGCACA-L8TX_181206_01_F12,3.6024868,-0.50819075 +10X_cells.GGACAGATCAGCTCTC-L8TX_181206_01_F12,7.3743873,-3.1318624 +10X_cells.TACGGGCAGTGGCACA-L8TX_181206_01_F12,4.212729,-2.2313511 +10X_cells.ACGCCGAGTGTAACGG-L8TX_181206_01_E12,5.8768806,-3.0309248 +10X_cells.GTTCATTCAGGGATTG-L8TX_181206_01_E12,5.5393033,-1.4480697 +10X_cells.TACTTGTAGGATTCGG-L8TX_180406_01_F01,4.245091,-1.9106611 +10X_cells.TACTCATTCCCGACTT-L8TX_180406_01_C01,3.6856027,-0.6720277 +10X_cells.GGAATAACAAGTCTAC-L8TX_180406_01_C02,2.7034788,-0.28918448 +10X_cells.GTCAAGTCATCTATGG-L8TX_190312_01_B02,4.223468,-3.1382635 +10X_cells.TTTCCTCTCGCGTAGC-L8TX_180221_01_F10,4.1325283,-3.032356 +10X_cells.CCTTCCCGTAAACACA-L8TX_180221_01_F10,2.716305,-1.3735385 +10X_cells.CTCGAGGTCACATGCA-L8TX_180221_01_G10,3.2291737,-2.491537 +10X_cells.TTTGGTTAGGTGTGGT-L8TX_180221_01_D10,5.7829003,-3.4185743 +10X_cells.ACGATGTGTGAGGGAG-L8TX_180221_01_D10,3.8728063,-0.26375556 +10X_cells.CGCTATCGTGTCGCTG-L8TX_180221_01_D10,5.738956,-3.2862942 +10X_cells.TGCGCAGCAAACGCGA-L8TX_180221_01_D10,3.9689934,-2.2652783 +10X_cells.CTGCCTAAGCCTCGTG-L8TX_180221_01_E10,5.934884,-2.9502518 +10X_cells.GTATTCTGTTCCCTTG-L8TX_180221_01_E10,4.941593,-3.464181 +10X_cells.AGAGTGGAGTAACCCT-L8TX_180221_01_F10,4.1671414,0.7259073 +10X_cells.TCCACACGTTGCTCCT-L8TX_180221_01_F10,3.5541787,0.19419108 +10X_cells.AAGTCTGGTAATTGGA-L8TX_180221_01_G10,3.2470274,-2.4163265 +10X_cells.CCGGTAGAGGCCCTCA-L8TX_180221_01_G10,3.1281476,-1.355582 +10X_cells.CCCAATCTCTTCCTTC-L8TX_180221_01_H10,5.2512856,-3.3713622 +10X_cells.GCGAGAAGTAGCGTGA-L8TX_180221_01_H10,5.4206967,-2.3303022 +10X_cells.GGGACCTGTGCAGGTA-L8TX_180221_01_H10,3.3588772,-2.308111 +10X_cells.CGTGTAATCACCCGAG-L8TX_190312_01_B02,4.535863,-1.4990897 +10X_cells.TACCTATCAAGTACCT-L8TX_190312_01_B02,7.109114,-2.7607293 +10X_cells.CTCTACGCACCCATGG-L8TX_190312_01_C02,3.7104247,-0.50137395 +10X_cells.TCATTTGGTGAAGGCT-L8TX_190312_01_C02,5.396803,-2.0529234 +10X_cells.TCTATTGAGCTGATAA-L8TX_190312_01_C02,3.1513095,-2.5651104 +10X_cells.AACCATGTCAGGCGAA-L8TX_190312_01_D02,5.913377,-3.2398 +10X_cells.CTGTGCTTCCGCGTTT-L8TX_190312_01_D02,4.2630477,-2.1094432 +10X_cells.GCAAACTCATTAGGCT-L8TX_190312_01_D02,4.1519227,0.022829868 +10X_cells.TCTATTGCAAAGGAAG-L8TX_190312_01_D02,4.1541133,-1.959447 +10X_cells.ATCTACTGTCCGAAGA-L8TX_190312_01_G02,4.176674,-0.18001169 +10X_cells.CAAGAAACAGCTCGAC-L8TX_190312_01_G02,3.5943298,0.5431145 +10X_cells.AAGTCTGGTAGCTCCG-L8TX_180907_01_B11,3.6590128,-0.14914317 +10X_cells.CGAGCCAAGACCCACC-L8TX_180926_01_C12,3.9519224,-1.8380919 +10X_cells.AAGGAGCGTCGACTGC-L8TX_181012_01_B05,9.94744,-3.2674594 +10X_cells.ACATCAGAGAGGACGG-L8TX_181012_01_B05,5.7096004,-2.4263449 +10X_cells.CTCTAATCAATCACAC-L8TX_181012_01_C05,3.7254639,-0.3125785 +10X_cells.TACCTTAGTTACTGAC-L8TX_181012_01_C05,4.448203,-0.52720565 +10X_cells.ACACTGATCCTAGAAC-L8TX_180221_01_B11,4.26325,-2.0363276 +10X_cells.TACCTTAAGATGGCGT-L8TX_180221_01_E11,4.2621226,-0.9451249 +10X_cells.AGGGAGTGTTGTCGCG-L8TX_180221_01_F11,3.8897243,-1.128271 +10X_cells.TGCCCATGTACTTGAC-L8TX_180221_01_F11,3.7581377,-0.6813289 +10X_cells.CTTCTCTGTGAGTATA-L8TX_180221_01_G11,7.105257,-3.3998077 +10X_cells.TCCACACCAGGGTTAG-L8TX_180221_01_G11,4.494029,-2.7662911 +10X_cells.CAGCTAATCTCATTCA-L8TX_190312_01_E02,2.2035384,-0.5155531 +10X_cells.CGAATGTAGTACGTAA-L8TX_190312_01_H02,0.70825374,-1.5852805 +10X_cells.TAAACCGTCCAGATCA-L8TX_190312_01_H02,6.09215,-3.4066603 +10X_cells.TAGGCATCAGTAAGCG-L8TX_190312_01_H02,3.7420719,-0.13872536 +10X_cells.TCGTAGATCTAAGCCA-L8TX_180907_01_B12,0.5723578,-2.1765754 +10X_cells.GCATGTATCCATTCTA-L8TX_190312_01_F01,3.375274,0.32142344 +10X_cells.ACTTGTTCAGCCAATT-L8TX_180907_01_G11,2.514952,-0.76920474 +10X_cells.CAACCTCGTGCGCTTG-L8TX_180907_01_B12,4.064484,-1.5858151 +10X_cells.CACCACTTCTACGAGT-L8TX_180907_01_B12,5.7542567,-2.956308 +10X_cells.TACTTGTCATCGGGTC-L8TX_180907_01_B12,5.3197145,-3.3096755 +10X_cells.ATGTGTGAGCACGCCT-L8TX_180907_01_E11,3.9778802,-2.1721475 +10X_cells.ATTACTCGTATAGGTA-L8TX_180907_01_F11,3.2020602,-1.8471794 +10X_cells.TGAGCCGAGTCACGCC-L8TX_190312_01_F01,5.637279,-3.5366476 +10X_cells.ACGGCCATCGTCACGG-L8TX_190312_01_A02,5.7808228,-2.6202724 +Smartseq_cells.LS-15534_S29_E12-50,5.0892344,-3.3610399 +Smartseq_cells.SM-GE5UR_S215_E1-50,6.349665,-3.4268975 +10X_cells.ATTTCTGAGACCTAGG-L8TX_180926_01_B01,6.7111382,-3.0800042 +10X_cells.GCATACAGTAGCTTGT-L8TX_180926_01_B01,5.5957046,-1.3179547 +10X_cells.AGTGTCATCCATGAAC-L8TX_180926_01_D01,4.069193,-0.34165278 +10X_cells.TGGCTGGCATTAGGCT-L8TX_180926_01_D01,4.4201846,-1.8897482 +10X_cells.CAGCAGCTCACTGGGC-L8TX_180926_01_E01,6.111039,-2.9874122 +10X_cells.TTCTACAAGCGTTGCC-L8TX_180926_01_F01,3.4086056,-2.3742607 +10X_cells.CAACCAACATAAGACA-L8TX_181011_01_A03,3.1329858,-1.3221731 +10X_cells.ACGGGTCTCAGTCAGT-L8TX_181011_01_B03,3.9412344,-0.91743904 +10X_cells.AGGGAGTGTCGTCTTC-L8TX_181011_01_B03,4.1129336,-1.5916982 +10X_cells.GCGAGAACATAGAAAC-L8TX_181011_01_B03,5.203073,-2.790623 +10X_cells.TCACAAGAGGAGTAGA-L8TX_181011_01_B03,3.2677767,-1.6003038 +10X_cells.TCGCGTTCAGCTTCGG-L8TX_181011_01_C03,4.69142,-1.9107158 +10X_cells.TGAGCCGCACAAGCCC-L8TX_181011_01_C03,7.370915,-3.1182265 +10X_cells.GCACATAGTTACGGAG-L8TX_181011_01_H03,3.054,-1.4578928 +10X_cells.CTAGTGAAGAGGTTAT-L8TX_180221_01_H11,5.2113557,1.3446679 +10X_cells.TAAGCGTCACGCATCG-L8TX_180712_01_A06,9.2445755,-3.9905322 +10X_cells.CTTGGCTCATTGGCGC-L8TX_180712_01_E05,12.376971,-2.378593 +10X_cells.GGGCACTTCCGCGGTA-L8TX_180712_01_F05,4.604723,-1.6910343 +10X_cells.GCACATAAGATGCGAC-L8TX_180712_01_H05,3.9516692,-1.7857633 +10X_cells.GTGCTTCTCTCCAACC-L8TX_180712_01_H05,3.226724,-1.3751134 +10X_cells.GGTGCGTGTAGCGTAG-L8TX_180712_01_A06,4.6269016,-1.2432976 +10X_cells.TGGTTCCTCTGGTATG-L8TX_180712_01_A06,3.752562,-2.2183313 +10X_cells.ACGATGTCACGGCCAT-L8TX_180221_01_A12,4.078582,-0.11266974 +10X_cells.CTGAAGTAGACGACGT-L8TX_180221_01_A12,4.089754,-1.0206314 +10X_cells.AAACGGGAGTACGTAA-L8TX_180221_01_B12,3.9411504,-0.0188628 +10X_cells.GCTGGGTAGCCCAGCT-L8TX_180221_01_B12,3.4656038,-0.9140715 +10X_cells.TCGTAGATCACGCATA-L8TX_180221_01_B12,2.5748467,-0.49979264 +10X_cells.GTGCAGCCATCGATGT-L8TX_200611_02_A05,4.621418,-2.3015554 +Smartseq_cells.SM-GE679_S256_E1-50,3.2645464,-2.530768 +Smartseq_cells.SM-GE679_S335_E1-50,6.52927,-3.422506 +10X_cells.GTACTTTTCGTGGGAA-L8TX_180115_01_H10,3.6495748,-0.76240534 +10X_cells.TATTACCAGGATCGCA-L8TX_180115_01_A11,3.3173435,-2.4865024 +10X_cells.GCAATCACAGCTCCGA-L8TX_180115_01_H10,4.0939536,-2.8510005 +10X_cells.TTGCGTCCAGTGAGTG-L8TX_180115_01_A09,4.9050846,-3.2239268 +10X_cells.CGGACACTCCAAGCCG-L8TX_180115_01_B09,3.4166787,-0.6407429 +10X_cells.GGATGTTCACTCGACG-L8TX_180115_01_B09,3.870125,-1.9144545 +10X_cells.GCTGGGTAGTCAATAG-L8TX_180115_01_D09,3.8310435,-1.5220169 +10X_cells.GTGCTTCAGGAGCGAG-L8TX_180115_01_D09,3.6941762,-1.3143348 +10X_cells.GGTATTGCAGGTCGTC-L8TX_180115_01_D10,3.9184222,0.06891611 +10X_cells.CCACGGATCTCAAACG-L8TX_180115_01_A11,3.0777838,-0.57771456 +10X_cells.CGCCAAGTCTGATACG-L8TX_180115_01_A11,3.8493655,-2.950069 +10X_cells.GTCACAAGTCGTCTTC-L8TX_180115_01_B10,3.4548562,-0.38522795 +10X_cells.CAGTCCTTCCGCATCT-L8TX_180115_01_B11,6.334251,-1.9767518 +10X_cells.TGGGAAGCAATAACGA-L8TX_180115_01_F10,3.3212268,0.032974046 +10X_cells.TTCTACAAGGGATGGG-L8TX_180115_01_F10,3.7315984,-0.6529047 +10X_cells.AAACGGGCATACTCTT-L8TX_180115_01_G10,3.9881744,-1.57725 +10X_cells.GCACTCTGTCTTGATG-L8TX_180115_01_G10,3.4734292,-0.31953412 +10X_cells.AGGGATGAGCGTGTCC-L8TX_180115_01_E11,3.7341878,-2.0520961 +10X_cells.TGTTCCGAGAACAACT-L8TX_180115_01_F11,3.380087,-2.4457943 +10X_cells.TACCTTAGTTTGACTG-L8TX_180115_01_H09,3.7848186,-0.27676693 +10X_cells.GTGAAGGTCCGCGCAA-L8TX_180115_01_A10,4.640046,-0.16914037 +10X_cells.GAATGAAAGTTGAGAT-L8TX_180115_01_F09,3.7766345,-1.3479675 +10X_cells.CTACACCTCATCGGAT-L8TX_171120_01_G07,4.5302973,-3.4180784 +10X_cells.CACCTTGAGATGCCTT-L8TX_180115_01_G08,5.5337586,-3.356974 +10X_cells.AAGCCGCGTGAGGCTA-L8TX_180115_01_D08,3.1571531,-2.3921528 +10X_cells.AACTGGTAGCGATAGC-L8TX_171120_01_D07,1.6737713,-0.3388608 +10X_cells.CTGTTTATCAACACGT-L8TX_171120_01_D07,3.6400266,-0.55414957 +10X_cells.TTCTACAGTTGAGGTG-L8TX_171120_01_F07,6.1091247,-0.09976963 +10X_cells.CTCCTAGCACACGCTG-L8TX_180115_01_E08,4.6633534,-2.9716394 +Smartseq_cells.LS-15007_S92_E1-50,5.6983643,-0.33647734 +Smartseq_cells.LS-15025_S56_E1-50,5.3432603,-2.5595956 +Smartseq_cells.LS-15347_S78_E1-50,3.810713,-2.9884334 +Smartseq_cells.LS-15352_S45_E1-50,4.985133,-3.1034026 +Smartseq_cells.LS-15579_S05_E1-50,3.639615,-2.9536734 +Smartseq_cells.SM-DD45I_S059_E1-50,3.8870404,-2.6915576 +Smartseq_cells.SM-GE67T_S319_E1-50,4.028149,-3.1007943 +Smartseq_cells.SM-GE91R_S052_E1-50,5.2886553,-3.1924405 +10X_cells.CTCGAGGGTCATTAGC-L8TX_180221_01_E09,5.051478,-0.6087886 +10X_cells.TCCACACCACCGCTAG-L8TX_180221_01_E09,3.7971175,-1.0298717 +10X_cells.ATTCTACAGGGATACC-L8TX_180221_01_D09,3.7010424,0.09833102 +10X_cells.TCAGCTCCAACTGCGC-L8TX_180221_01_D09,5.183424,-0.5644233 +10X_cells.TTCTCCTGTTCGAATC-L8TX_180607_01_C05,4.4033427,-0.30594343 +10X_cells.ACTGAACCAACAACCT-L8TX_180712_01_B06,5.353972,-0.42698762 +10X_cells.CTTGGCTGTAGTACCT-L8TX_180712_01_B06,4.8835526,-0.84243053 +Smartseq_cells.LS-15329_S84_E1-50,5.711801,-1.0323651 +10X_cells.GTGGGTCTCTCTAAGG-L8TX_181012_01_G04,3.887381,0.15304576 +10X_cells.ACGAGCCCAGTATCTG-L8TX_171026_01_A04,5.3135543,-2.0458727 +10X_cells.CATTATCCATGTCGAT-L8TX_171026_01_G03,5.4934006,-0.4062624 +10X_cells.TGCACCTGTCACTTCC-L8TX_171026_01_H03,4.7677875,-0.6653333 +10X_cells.GGACAAGCAGCTCCGA-L8TX_171026_01_C05,3.6052458,0.9786394 +10X_cells.CCAGCGAAGTGTCTCA-L8TX_171026_01_E05,4.600854,0.061466493 +10X_cells.TGGTTCCTCCGAAGAG-L8TX_171026_01_F05,6.137467,-1.5082853 +Smartseq_cells.SM-DD449_S73_E1-50,5.2987037,-0.80995965 +Smartseq_cells.SM-GE935_S281_E1-50,6.110696,-1.252278 +Smartseq_cells.SM-GE935_S333_E1-50,5.128741,-1.0913157 +10X_cells.TGACTTTTCCGAACGC-L8TX_181206_01_H11,4.9983206,-0.19032557 +10X_cells.CATCAGAAGTAGGCCA-L8TX_180221_01_D10,4.3158436,0.23555094 +10X_cells.TAAACCGGTGTCGCTG-L8TX_180221_01_D10,4.322321,-0.033033825 +10X_cells.AGATTGCCAACTTGAC-L8TX_180221_01_E10,3.8303657,0.5404258 +10X_cells.ACCGTAATCGCCTGAG-L8TX_180221_01_F10,3.8002925,0.7894659 +10X_cells.ATCATGGAGGTAAACT-L8TX_190312_01_B02,3.8592296,0.13906229 +10X_cells.CCAATCCAGATGTGTA-L8TX_190312_01_D02,3.7518477,-0.33800685 +10X_cells.ACTTTCAGTACCAGTT-L8TX_190312_01_G02,4.325029,-0.17689557 +10X_cells.TGCGGGTTCGAGAGCA-L8TX_190312_01_G02,4.4745665,-0.059734736 +10X_cells.CTACATTGTTGGTAAA-L8TX_180926_01_C12,5.025721,-0.80991054 +10X_cells.CATCGGGCAAGGACTG-L8TX_180907_01_G11,5.506731,-1.0178305 +10X_cells.GTATTCTTCAGCATGT-L8TX_180907_01_G11,5.3702416,-0.28289235 +10X_cells.AGCGTCGCACTAAGTC-L8TX_190312_01_F01,5.3087144,-1.691423 +10X_cells.AAGACCTCACCGATAT-L8TX_180926_01_E01,5.928786,-1.087076 +10X_cells.GAATAAGGTCACACGC-L8TX_180926_01_D01,3.882885,0.3371927 +10X_cells.GCTCCTATCAGGCAAG-L8TX_181011_01_C03,3.415682,1.1056373 +10X_cells.ATCTGCCAGACTAGAT-L8TX_181011_01_H03,5.55429,-0.076344155 +10X_cells.GAACCTATCTAACCGA-L8TX_180712_01_F05,3.6422117,0.25281286 +10X_cells.CGCGTTTCATGTTCCC-L8TX_180712_01_H05,4.953875,-1.1855692 +10X_cells.GAAATGAAGACGCACA-L8TX_180712_01_H05,6.0718265,-2.0938249 +10X_cells.CGTTCTGAGTGGACGT-L8TX_200611_02_A05,4.124359,-0.21066049 +10X_cells.TCGCGAGAGACTTTCG-L8TX_180115_01_A11,4.108092,-0.6684327 +10X_cells.GGGTCTGGTAAATGAC-L8TX_180115_01_F11,3.6827629,0.3073716 +10X_cells.ACACTGAGTGCTTCTC-L8TX_180115_01_B10,3.8228867,0.14504868 +10X_cells.CTTTGCGAGTACTTGC-L8TX_180115_01_B11,5.2463536,-0.6294629 +10X_cells.GTGCATAAGGCGCTCT-L8TX_180115_01_C11,4.7822657,-0.80918086 +10X_cells.AACTCCCTCCACGACG-L8TX_180115_01_F10,4.5079317,0.5008824 +10X_cells.CACACCTTCAGTTGAC-L8TX_180115_01_G11,7.630653,-2.9313066 +10X_cells.TACGGATAGTCCGGTC-L8TX_171120_01_H07,5.1709905,-0.8058297 +10X_cells.GCAATCAAGCATGGCA-L8TX_171120_01_F07,5.366959,-0.2473696 +Smartseq_cells.LS-15081_S09_E1-50,5.397431,-0.9976234 +10X_cells.CAGCATATCGGTCCGA-L8TX_180221_01_B10,7.5353413,-1.4194099 +10X_cells.CTCGTACTCCATGCTC-L8TX_180406_01_F02,4.1751122,-0.17117113 +10X_cells.TCAGGATCATAGACTC-L8TX_180221_01_G09,6.056957,-1.589818 +10X_cells.ACCCACTGTAAGGGAA-L8TX_180221_01_C10,4.515221,2.3286226 +10X_cells.CGCGTTTGTCTCGTTC-L8TX_180406_01_F02,5.1816864,-2.8469577 +10X_cells.GGACAGAAGTGGGATC-L8TX_180221_01_F09,1.9715506,-1.6048572 +10X_cells.GTTTCTATCTTATCTG-L8TX_180221_01_F09,5.316979,0.61137116 +10X_cells.CGAGAAGAGGCGACAT-L8TX_180221_01_G09,4.7104464,-0.35203353 +10X_cells.GCAGCCATCTTTAGGG-L8TX_180221_01_G09,6.0266967,-1.3740366 +10X_cells.TACTCATTCGGCGGTT-L8TX_180221_01_G09,4.442579,0.123840414 +10X_cells.AAACGGGTCGAGCCCA-L8TX_180221_01_A10,6.2361565,-1.2047616 +10X_cells.TCACGAAAGGCGTACA-L8TX_180221_01_A10,4.5907097,2.6836174 +10X_cells.AAATGCCGTTGGACCC-L8TX_180221_01_B10,2.5948482,-1.337119 +10X_cells.GTACGTAAGAAGATTC-L8TX_180221_01_B10,4.441465,-0.03721723 +10X_cells.GACGGCTCAGGGCATA-L8TX_180221_01_C10,5.9134355,-0.5082091 +10X_cells.GCGCAGTAGGTGTGGT-L8TX_180406_01_F02,5.8085117,-1.924953 +Smartseq_cells.SM-GE63J_S106_E1-50,5.096571,-0.9387723 +10X_cells.GATCGTACATAAGACA-L8TX_180221_01_D09,9.235022,-3.6198096 +10X_cells.TTGAACGAGTGTCCAT-L8TX_180221_01_D09,9.615528,-2.9454186 +10X_cells.ATGGGAGGTCGTGGCT-L8TX_180712_01_B06,6.820127,-2.8137584 +10X_cells.TTATGCTGTTGGACCC-L8TX_180712_01_B06,5.9740524,0.021533327 +Smartseq_cells.LS-15313_S77_E2-50,4.3678107,-1.6073624 +Smartseq_cells.LS-15322_S48_E2-50,6.1092405,-1.2311329 +Smartseq_cells.LS-15323_S45_E2-50,6.195592,-1.1622496 +10X_cells.ACCGTAATCTTCCTTC-L8TX_180829_01_D10,4.0709815,0.89706975 +10X_cells.AGCTTGATCACCTCGT-L8TX_180829_01_D10,3.6369116,0.89929914 +10X_cells.GACGTGCCATGAACCT-L8TX_181012_01_H04,5.571849,-1.4574414 +10X_cells.TGGGCGTTCCTGTACC-L8TX_181012_01_E05,4.0888076,-0.3341726 +10X_cells.TGAGCCGAGTCCAGGA-L8TX_180406_01_E07,3.633911,-0.56346464 +10X_cells.TCTGAGACAGCTGTGC-L8TX_180221_01_G12,5.077193,0.047711693 +10X_cells.AACTCTTTCTCCGGTT-L8TX_171026_01_F03,4.506551,-0.6911139 +10X_cells.AGTCTTTGTTCCACAA-L8TX_171026_01_B05,2.8258739,-0.46107918 +10X_cells.CTGCCTAGTACAGTTC-L8TX_171026_01_B05,5.9150634,-1.8876245 +10X_cells.AAATGCCAGAGACTAT-L8TX_171026_01_F04,5.5729556,-1.0787148 +10X_cells.CCTTCCCAGTAGGTGC-L8TX_171026_01_B04,3.950167,-1.4066808 +10X_cells.GGATTACGTTATGCGT-L8TX_171026_01_H05,3.7127857,-1.4546442 +10X_cells.TTGTAGGCAGTCCTTC-L8TX_171026_01_F03,5.720289,-1.9020491 +10X_cells.AGAGCGAGTTTAGCTG-L8TX_171026_01_G04,4.1334567,0.29821625 +10X_cells.AGATCTGGTCGCGAAA-L8TX_171026_01_B04,5.181319,-0.22203419 +10X_cells.TTGCGTCAGAGAGCTC-L8TX_171026_01_H03,5.630838,-0.5863288 +10X_cells.AACTCCCAGCCACCTG-L8TX_171026_01_F03,5.993265,-1.0793461 +10X_cells.ACGAGCCCATTTGCTT-L8TX_171026_01_F03,6.7693896,-1.1618011 +10X_cells.TGGCTGGCAAAGTGCG-L8TX_171026_01_F03,4.473558,0.2339872 +10X_cells.CTTAACTCAAGAAGAG-L8TX_171026_01_B04,5.27896,-0.7709792 +10X_cells.TGAGCCGAGCGTGTCC-L8TX_171026_01_B04,6.173105,-2.066804 +10X_cells.CAAGGCCAGAATGTGT-L8TX_171026_01_F04,0.10562175,-3.507201 +10X_cells.ACTGATGCACCCAGTG-L8TX_171026_01_G04,4.348183,-1.1844559 +10X_cells.GACGGCTTCATTGCGA-L8TX_171026_01_G04,6.2109504,-1.4654744 +10X_cells.GTACTCCAGTGTACCT-L8TX_171026_01_B05,6.4140983,-1.7532672 +10X_cells.GTTAAGCGTAGGACAC-L8TX_171026_01_H04,5.4005547,-1.2024229 +10X_cells.CACACAACATTCTCAT-L8TX_171026_01_A05,5.7491746,-1.2588934 +10X_cells.CGAATGTGTCTGATTG-L8TX_171026_01_H03,3.280421,-1.1630938 +10X_cells.GCGCAGTGTTTGGCGC-L8TX_171026_01_H03,4.376191,-0.004853608 +10X_cells.GTGTTAGGTGCTCTTC-L8TX_171026_01_H03,4.5124736,-0.7594223 +10X_cells.TACTCGCAGGGAAACA-L8TX_171026_01_H03,4.862999,-1.0716274 +10X_cells.CTCGAAATCTAACTCT-L8TX_171026_01_A04,6.6939735,-1.4830709 +10X_cells.CATGACAAGGATCGCA-L8TX_171026_01_C05,4.096294,-0.620653 +10X_cells.CGCCAAGAGTGCAAGC-L8TX_171026_01_E05,4.558433,-0.004300111 +10X_cells.ACCTTTAAGCCAACAG-L8TX_171026_01_F05,8.235886,-2.795013 +10X_cells.GTCGTAAAGGTGCACA-L8TX_171026_01_F05,5.0370016,0.13383155 +10X_cells.TGATTTCGTGACCAAG-L8TX_171026_01_F05,6.632012,-1.7742158 +10X_cells.GCTCTGTGTTCCGTCT-L8TX_171026_01_G05,4.4027753,-0.6271637 +10X_cells.CCTCTGACAGGCGATA-L8TX_171026_01_H05,5.9244704,-0.99679524 +10X_cells.TGACTTTTCAGTTAGC-L8TX_171026_01_H05,0.39536363,-2.101467 +10X_cells.TTAGTTCGTCAACTGT-L8TX_171026_01_H05,3.2417893,-0.912164 +Smartseq_cells.LS-15538_S44_E1-50,3.7447278,-1.4449221 +10X_cells.GCTTGAACAAAGCAAT-L8TX_181206_01_A12,7.8228726,-1.9430833 +10X_cells.CATCAAGCAGGCAGTA-L8TX_181206_01_E12,5.011882,-0.6368116 +10X_cells.CTAGCCTAGACAAGCC-L8TX_180221_01_D10,4.6398454,-0.53734446 +10X_cells.AAAGCAAGTATCAGTC-L8TX_180221_01_F10,5.500867,-2.580864 +10X_cells.TTGCGTCTCGTACCGG-L8TX_190312_01_B02,5.2260394,-1.0105515 +10X_cells.GGACGTCGTAGGAGTC-L8TX_181012_01_B05,6.053598,-2.3199959 +10X_cells.CGTTGGGCATTTCAGG-L8TX_190312_01_E02,-1.8471502,-2.0006495 +10X_cells.GTAACTGTCAAACCGT-L8TX_190312_01_E02,5.6890464,-1.9324545 +10X_cells.CGTAGGCTCAGCGATT-L8TX_190312_01_F02,4.3120527,0.18192229 +10X_cells.CAGAATCGTTCATGGT-L8TX_180221_01_D11,9.436219,-2.861759 +10X_cells.CATCAGAAGACCTAGG-L8TX_180221_01_D11,4.856646,0.09430763 +10X_cells.AAGCCGCAGCCGCCTA-L8TX_180907_01_G11,6.207332,-1.338518 +10X_cells.CGAGCCAAGCTAACTC-L8TX_180907_01_A12,6.134662,-1.8047795 +10X_cells.TTGCGTCGTACAGTTC-L8TX_180926_01_D01,5.4855943,-0.45967114 +10X_cells.GTCACAACATCATCCC-L8TX_181011_01_H03,4.6574783,-0.7347852 +10X_cells.AGCAGCCAGATGCCTT-L8TX_180712_01_E05,5.7543426,-1.1222974 +10X_cells.GTGCAGCCAGGGTATG-L8TX_180221_01_C12,4.6539893,0.6733754 +10X_cells.ATTCTACCATGCAACT-L8TX_180115_01_E11,3.5514352,-0.050601132 +10X_cells.CAACCTCCATGGGACA-L8TX_180115_01_C10,4.4137177,0.24799514 +10X_cells.ATCGAGTTCCCTGACT-L8TX_180115_01_D11,5.3802905,-0.7090439 +10X_cells.CGCTTCAGTCATTAGC-L8TX_180115_01_D11,5.3828354,-0.22599584 +10X_cells.AAAGATGAGTTTAGGA-L8TX_180115_01_F11,5.2832556,-0.7274552 +Smartseq_cells.LS-15010_S93_E1-50,3.6289265,-1.189662 +10X_cells.GGAAAGCAGTGGTAAT-L8TX_180221_01_A10,5.221499,3.6593454 +10X_cells.TGGCCAGAGCAACGGT-L8TX_180221_01_B10,4.254627,3.5893476 +10X_cells.GTCGGGTGTATAGTAG-L8TX_180221_01_C10,4.1688952,1.9409206 +10X_cells.TACTTACAGATATGGT-L8TX_180221_01_C10,5.048965,2.4228904 +10X_cells.CCACTACCATAGACTC-L8TX_180406_01_C06,4.22816,1.8498285 +10X_cells.CGTTGGGAGAATAGGG-L8TX_180221_01_D09,5.050401,0.69401366 +10X_cells.GAACCTAAGGGCTCTC-L8TX_180607_01_C05,3.7092118,0.77201045 +10X_cells.AAGGTTCTCGCCAAAT-L8TX_180221_01_H12,4.6241302,2.5328438 +10X_cells.ACGTCAAAGCCCAATT-L8TX_180221_01_H12,4.378478,1.9686891 +10X_cells.AGCAGCCAGAAACCGC-L8TX_180221_01_E09,5.033502,3.5279167 +10X_cells.TCGCGAGCATCGATTG-L8TX_180221_01_E09,5.5315814,1.5562218 +10X_cells.TGCTACCTCGTCACGG-L8TX_180221_01_E09,5.427513,1.2229844 +10X_cells.CAACCTCGTGTCAATC-L8TX_180221_01_C09,6.1742945,1.8485935 +10X_cells.CACAAACCAGCAGTTT-L8TX_180221_01_C09,4.6801543,2.4685583 +10X_cells.CACCAGGCAGTCAGAG-L8TX_180221_01_C09,5.1557302,2.208121 +10X_cells.CATCGAATCATGTGGT-L8TX_180221_01_C09,4.705878,3.2627325 +10X_cells.GACACGCTCTCCGGTT-L8TX_180221_01_C09,4.7624145,1.7364358 +10X_cells.TTCTTAGGTCTTCAAG-L8TX_180221_01_C09,4.9602556,2.6089163 +10X_cells.ATTTCTGTCCTTAATC-L8TX_180221_01_D09,5.028855,2.1790137 +10X_cells.CGTTGGGGTAGCGATG-L8TX_180221_01_D09,5.4515605,1.2070484 +10X_cells.GTCCTCAGTAACGTTC-L8TX_180221_01_D09,4.136246,2.1052258 +10X_cells.GACTGCGTCGTGGACC-L8TX_180607_01_C05,4.9027157,1.2175487 +10X_cells.TGCGGGTTCGGTCCGA-L8TX_180607_01_C05,5.561157,0.6803885 +10X_cells.ACGCCAGAGAAACGAG-L8TX_180712_01_G05,4.997237,0.53585666 +10X_cells.AGAGTGGTCGTAGATC-L8TX_180712_01_G05,5.07831,2.475633 +10X_cells.CGTAGGCAGGATGTAT-L8TX_180712_01_G05,4.620275,1.1580228 +10X_cells.TGGCCAGGTGTGGCTC-L8TX_180712_01_G05,4.859719,2.7072072 +10X_cells.TGTATTCGTCTGCAAT-L8TX_180712_01_G05,5.065734,2.6363301 +10X_cells.CACACTCAGCTGCAAG-L8TX_180712_01_B06,5.039355,3.156714 +10X_cells.CTCGGAGGTTGGACCC-L8TX_180712_01_B06,5.8175597,1.2939353 +10X_cells.GACTGCGTCGAGAACG-L8TX_180712_01_B06,4.8443155,1.5910134 +10X_cells.GGACGTCGTACTTGAC-L8TX_180712_01_B06,4.480279,0.87429607 +10X_cells.ACCCACTCACAGACAG-L8TX_180712_01_C06,5.345642,-0.45212364 +10X_cells.AGCTCCTCATCTGGTA-L8TX_180712_01_C06,5.865728,0.15025921 +Smartseq_cells.SM-GE67M_S166_E1-50,4.7920322,3.1350536 +Smartseq_cells.LS-15313_S31_E2-50,4.946979,3.5823886 +Smartseq_cells.LS-15313_S92_E2-50,5.6892867,-0.12138727 +Smartseq_cells.LS-15329_S94_E1-50,5.692717,-1.0088017 +Smartseq_cells.SM-D9D9E_S02_E1-50,5.1827636,3.5782678 +10X_cells.GTGCAGCTCGCGTTTC-L8TX_180829_01_D10,4.707747,0.529818 +10X_cells.CACCAGGTCCGGGTGT-L8TX_180907_01_G10,5.6040845,0.31898695 +10X_cells.GCAAACTAGCTGCAAG-L8TX_181011_01_G02,4.6452336,2.7494001 +10X_cells.AGTAGTCGTGCAGACA-L8TX_181011_01_H02,4.3687267,3.288001 +10X_cells.CAGTCCTTCGGGAGTA-L8TX_181011_01_C04,4.9774995,1.7106491 +10X_cells.CACCAGGCACACCGCA-L8TX_180406_01_H01,4.6571345,0.56318706 +10X_cells.CAGCAGCAGGCCCTTG-L8TX_180406_01_E02,4.4239073,1.1799295 +Smartseq_cells.SM-GE5VD_S080_E1-50,5.7970414,0.3375503 +10X_cells.TGGGAAGTCCGCAAGC-L8TX_171026_01_B04,5.750331,1.6814777 +10X_cells.TGCTACCTCATTTGGG-L8TX_171026_01_G04,5.835464,1.7046885 +10X_cells.GAATAAGCAGTAAGAT-L8TX_171026_01_H04,4.079774,4.1400146 +10X_cells.CAACTAGGTATGAAAC-L8TX_171026_01_A05,4.609032,2.0019016 +10X_cells.CTCTACGTCGCGTTTC-L8TX_171026_01_A04,5.2274194,-0.14916295 +10X_cells.CCCAATCAGCCCAGCT-L8TX_171026_01_F05,5.925909,0.8388576 +10X_cells.AGATTGCCACCCTATC-L8TX_171026_01_G05,5.7216425,3.4450476 +10X_cells.CTAGTGATCAGTCAGT-L8TX_171026_01_H05,5.493161,1.0314189 +10X_cells.GGACGTCGTAGCCTAT-L8TX_171026_01_H05,5.4407105,1.3925598 +Smartseq_cells.SM-GE92I_S113_E1-50,5.559918,0.24658419 +Smartseq_cells.SM-GE92I_S373_E1-50,5.020036,3.885871 +10X_cells.GGGAATGCATCGTCGG-L8TX_190312_01_C02,5.0905366,1.4532578 +10X_cells.CCTAAAGTCTGAGTGT-L8TX_180221_01_H10,5.120049,1.4263676 +10X_cells.AGAGCGAAGATCCGAG-L8TX_180221_01_D10,4.470902,2.4072425 +10X_cells.TTCTTAGAGTGGTAGC-L8TX_180221_01_D10,3.9930036,2.0855265 +10X_cells.AAAGTAGTCGGTGTTA-L8TX_180221_01_E10,4.5510974,1.4422206 +10X_cells.ACGAGGACACCAGGCT-L8TX_180221_01_E10,3.9259982,2.0954268 +10X_cells.ATGCGATGTTACAGAA-L8TX_180221_01_E10,5.7548423,0.50201976 +10X_cells.GATCTAGCATACTACG-L8TX_180221_01_E10,5.631587,3.9494317 +10X_cells.GCACATACATGCATGT-L8TX_180221_01_F10,4.0232277,2.020103 +10X_cells.TCAGGTAAGTAGGTGC-L8TX_180221_01_F10,4.2300534,1.983413 +10X_cells.TCTGGAAAGCGTTGCC-L8TX_180221_01_F10,4.9198985,1.4947218 +10X_cells.GGAGCAAAGTGTCTCA-L8TX_180221_01_G10,4.6143737,1.8369222 +10X_cells.ACGATGTCAAGCCGTC-L8TX_180221_01_H10,5.535599,0.84184086 +10X_cells.CGTAGCGGTGTGGCTC-L8TX_180221_01_A11,5.4795237,1.705409 +10X_cells.CTCAGAATCTGCGTAA-L8TX_180221_01_A11,5.4787793,1.4071492 +10X_cells.ACCAGTAAGGTGATAT-L8TX_190312_01_B02,5.0857615,3.979901 +10X_cells.AGCTCCTAGTGCAAGC-L8TX_190312_01_B02,5.175734,1.2063485 +10X_cells.GCGCAACTCGTAGGTT-L8TX_190312_01_B02,5.2874036,0.12937523 +10X_cells.CCACCTACAACTGGCC-L8TX_190312_01_C02,4.2906594,0.5922991 +10X_cells.ACTTACTCAAGCCGCT-L8TX_180907_01_B11,5.140006,0.6651157 +10X_cells.CAAGAAAAGATCCCAT-L8TX_180926_01_C12,5.7342443,-0.39902797 +10X_cells.CCTCTGATCCAAATGC-L8TX_180926_01_E12,4.9411287,2.7054856 +10X_cells.TACGGATAGGGCACTA-L8TX_180221_01_G11,5.892962,0.80200243 +10X_cells.CCGTTCAGTCAAGCGA-L8TX_180221_01_D11,4.5201035,-0.15088557 +10X_cells.GGCCGATGTCGTCTTC-L8TX_190312_01_E02,5.9095407,2.3099377 +10X_cells.TCATTTGAGGAGTTGC-L8TX_180907_01_F11,5.1641517,2.8458989 +10X_cells.CCCTCCTTCTTTAGGG-L8TX_180907_01_A12,5.386868,2.8125145 +10X_cells.TCAGCTCGTTCGCTAA-L8TX_180907_01_A12,5.7432275,-1.1929836 +10X_cells.CTTAACTCATACGCCG-L8TX_180907_01_F11,5.5706177,0.28052336 +10X_cells.CGTTAGATCGTGTAGT-L8TX_180926_01_D01,5.3530016,0.73339736 +10X_cells.GCATGCGAGAATTGTG-L8TX_181011_01_H03,4.0202665,1.3139654 +10X_cells.AGCTCCTGTTGTGGCC-L8TX_180926_01_B01,4.7825418,1.2811337 +10X_cells.AGAATAGCATGACATC-L8TX_180926_01_E01,4.683382,0.9944184 +10X_cells.CGATGTAGTAAAGGAG-L8TX_180926_01_E01,5.0284767,1.6985948 +10X_cells.ACTGTCCCATTACCTT-L8TX_181011_01_B03,5.862023,1.3109232 +10X_cells.CTACACCTCTGAGGGA-L8TX_200611_02_A05,5.9125896,1.6151654 +10X_cells.AGGGTGATCGGCTTGG-L8TX_180221_01_B12,3.7663395,1.6270472 +10X_cells.TTGCCGTCAGGATTGG-L8TX_180504_01_E01,6.162356,1.8861353 +10X_cells.GGACAAGGTCGCGGTT-L8TX_180504_01_E01,3.0088398,2.0490355 +10X_cells.TTATGCTCACGGTAAG-L8TX_180712_01_E05,5.6553297,1.4368834 +10X_cells.ATTATCCAGTGATCGG-L8TX_180712_01_H05,4.443094,3.033129 +10X_cells.CGAGAAGTCTTCCTTC-L8TX_180712_01_H05,4.8949084,2.984408 +10X_cells.CGGCTAGGTTCGAATC-L8TX_180712_01_H05,5.1281543,1.1783158 +10X_cells.ACATCAGTCTGTTGAG-L8TX_180221_01_A12,3.9037185,1.5123698 +10X_cells.AGATTGCGTACAGTTC-L8TX_180221_01_B12,4.3879113,1.7419288 +10X_cells.CTCGGGAGTCCGAAGA-L8TX_180221_01_B12,4.468137,1.5344901 +10X_cells.TTCTACACAGGAATCG-L8TX_180221_01_B12,3.7987936,1.1980335 +10X_cells.TTGGAACTCATCACCC-L8TX_180221_01_B12,3.7952342,1.7312168 +10X_cells.AGTAGTCAGCTGAAAT-L8TX_180221_01_C12,4.7960634,2.5596237 +10X_cells.GCAAACTGTCGTCTTC-L8TX_180221_01_C12,3.6542764,1.9480673 +10X_cells.AAGGTTCTCGAGAACG-L8TX_180221_01_D12,4.2580037,0.45120522 +10X_cells.TCATTACAGAATTGTG-L8TX_180221_01_D12,5.2504916,1.8867596 +10X_cells.CATTCGCAGTAGCCGA-L8TX_180221_01_H11,4.5521727,1.9872519 +10X_cells.CCTATTAAGTGCTGCC-L8TX_180221_01_H11,4.5075474,1.7141987 +10X_cells.GGAACTTAGGTTACCT-L8TX_180221_01_H11,4.6722217,1.4499135 +10X_cells.TATCAGGAGAAGCCCA-L8TX_180221_01_H11,4.5753193,1.3033425 +10X_cells.TTAACTCGTCTTGCGG-L8TX_180221_01_H11,5.6590796,1.5378429 +10X_cells.CCTTCGAGTAAACACA-L8TX_200611_02_A05,3.5346453,0.88198036 +10X_cells.CTCTACGGTACAGTTC-L8TX_200611_02_A05,5.8148985,1.5564837 +10X_cells.TCACGAAGTCCGTCAG-L8TX_200611_02_A05,4.820815,2.5229661 +Smartseq_cells.SM-GE91L_S104_E1-50,5.225403,0.5002901 +10X_cells.GCTCTGTTCCTTCAAT-L8TX_180115_01_C09,4.4961953,1.6541336 +10X_cells.AGAGCGACAGAGTGTG-L8TX_180115_01_D09,5.167926,1.0457139 +10X_cells.AACTCCCTCTACTCAT-L8TX_180115_01_H10,5.433757,0.597101 +10X_cells.CGCTATCAGCTGAACG-L8TX_180115_01_B10,5.1285186,0.39117107 +10X_cells.GAGCAGATCGCCAGCA-L8TX_180115_01_B11,5.4429064,1.0677031 +10X_cells.GACCTGGGTGAGCGAT-L8TX_180115_01_C11,4.221387,3.7365897 +10X_cells.GATGCTACAGCTTCGG-L8TX_180115_01_C11,5.0815105,0.7862049 +10X_cells.TGAGAGGCACATAACC-L8TX_180115_01_C11,4.8320904,0.8006291 +10X_cells.AGATCTGTCAAGCCTA-L8TX_180115_01_E10,4.3365827,3.568251 +10X_cells.CTACACCAGAGCTGGT-L8TX_180115_01_G10,4.968186,0.2337343 +10X_cells.ATGAGGGTCGGAGCAA-L8TX_180115_01_H11,4.867156,2.9628046 +10X_cells.CCTTCCCCAGAGTGTG-L8TX_180115_01_H11,4.5852838,2.5347395 +10X_cells.CGAACATAGAAGGTTT-L8TX_180115_01_H11,4.9034605,2.6029499 +10X_cells.TCTGAGAGTCAACATC-L8TX_180115_01_G08,4.040827,4.3919353 +10X_cells.TCTGGAATCATAACCG-L8TX_171120_01_C07,5.7563677,0.619854 +10X_cells.CTACCCATCTGCTTGC-L8TX_180115_01_D08,5.7451053,0.66421837 +10X_cells.ACGAGGATCGTCCAGG-L8TX_171120_01_E07,5.527362,0.3389488 +10X_cells.GACCTGGGTAGCGTGA-L8TX_171120_01_E07,5.7163005,0.85784703 +Smartseq_cells.LS-15003_S08_E1-50,5.6764455,-0.45724335 +Smartseq_cells.LS-15004_S72_E1-50,6.3056517,1.475191 +Smartseq_cells.LS-15050_S53_E1-50,5.629715,1.2983662 +Smartseq_cells.LS-15081_S11_E1-50,5.48388,1.2343663 +Smartseq_cells.LS-15085_S24_E1-50,5.4178233,1.2730387 +Smartseq_cells.LS-15507_S34_E2-50,5.5091515,0.7425702 +Smartseq_cells.LS-15577_S59_E1-50,5.4162145,0.21316391 +Smartseq_cells.SM-DD45L_S137_E1-50,5.4384475,1.30676 +10X_cells.GTATTCTAGTGGACGT-L8TX_180221_01_C09,3.311083,0.49582437 +10X_cells.GCATGTATCCGTACAA-L8TX_180221_01_E09,3.4564433,-0.099795304 +10X_cells.TACAGTGAGTGAACAT-L8TX_180221_01_C09,3.037139,0.19238491 +10X_cells.AACTCCCCACAGACAG-L8TX_180221_01_D09,2.406263,-0.81935817 +10X_cells.ACGCCGATCCGCAGTG-L8TX_180712_01_G05,3.0520287,0.16117507 +Smartseq_cells.LS-15329_S81_E1-50,3.0061364,-0.5053092 +10X_cells.ATGCGATTCACGGTTA-L8TX_180829_01_D10,3.2881894,-0.44329017 +10X_cells.TCAGATGGTTTCCACC-L8TX_181012_01_H04,3.478765,0.36470523 +10X_cells.ACTGCTCTCCCATTAT-L8TX_200625_02_E11,3.0062807,-1.5703912 +10X_cells.CTGATCCAGCGATATA-L8TX_171026_01_G04,3.4685156,-0.47233275 +10X_cells.TTCTTAGGTCAGTGGA-L8TX_171026_01_D05,3.1725929,1.1684177 +10X_cells.CCGTGGATCTCAAACG-L8TX_181206_01_F12,4.103955,0.22748756 +Smartseq_cells.SM-GE8ZH_S095_E1-50,4.9038353,-1.0281166 +10X_cells.AGGTCATAGAGCTGGT-L8TX_180221_01_D10,2.8911073,1.4014087 +10X_cells.TACGGATTCACTCTTA-L8TX_180221_01_D10,3.1893778,1.1884203 +10X_cells.CTCGTCAAGTCTCGGC-L8TX_180221_01_E10,3.0789435,0.37597528 +10X_cells.GCGGGTTGTTACCGAT-L8TX_180221_01_F10,4.695267,-0.741752 +10X_cells.GGACAAGAGTTGAGAT-L8TX_190312_01_D02,3.5767164,-0.12689756 +10X_cells.TACCTTATCCACGAAT-L8TX_181011_01_B03,3.7635384,0.7115162 +10X_cells.GTCACAATCCGCTGTT-L8TX_181011_01_C03,2.833506,0.85467327 +10X_cells.GTCAAGTCACTGCCAG-L8TX_180712_01_E05,2.3694823,1.4765438 +10X_cells.CCTCTGAAGGATGGTC-L8TX_180712_01_A06,3.9028735,0.6683968 +10X_cells.CGGAGTCCAGATGAGC-L8TX_180504_01_E01,3.0006654,0.3724285 +10X_cells.GGGATGAAGACTCGGA-L8TX_180221_01_A12,3.6137588,0.25018463 +10X_cells.AACTCCCCATCGATTG-L8TX_180221_01_F09,7.9847107,-0.02454002 +10X_cells.CTAAGACCATCGGACC-L8TX_180221_01_B10,6.87209,2.331442 +10X_cells.AACTCTTCAAAGGTGC-L8TX_180406_01_F02,6.8145742,1.3328112 +10X_cells.GTAGGCCAGCAGATCG-L8TX_180221_01_D09,5.8354588,1.312072 +10X_cells.AAGCCGCTCCAAACAC-L8TX_180712_01_B06,4.842465,1.021588 +10X_cells.CAAGGCCAGGCTAGGT-L8TX_180221_01_D09,7.26156,2.6752734 +10X_cells.GCTGGGTCAGCCTATA-L8TX_180712_01_B06,6.4338427,2.329492 +10X_cells.GTAACGTGTTCCACGG-L8TX_180221_01_H12,6.435398,1.5135894 +10X_cells.AGCTTGAGTTGCCTCT-L8TX_180221_01_C09,6.5400643,-0.90410787 +10X_cells.GTAGGCCAGCGATATA-L8TX_180221_01_C09,6.217691,0.31292495 +10X_cells.GCTTGAAGTGTCCTCT-L8TX_180607_01_C05,7.024771,2.1165752 +10X_cells.GACTACACACGTTGGC-L8TX_180712_01_G05,5.453968,-3.085651 +10X_cells.TCAGCAAGTACGCACC-L8TX_180712_01_G05,6.4409766,-0.37629625 +10X_cells.CACAGTAAGAGCCCAA-L8TX_180712_01_B06,5.9859943,0.37409192 +Smartseq_cells.LS-15323_S90_E2-50,7.3479266,0.5689481 +Smartseq_cells.LS-15329_S33_E1-50,6.675125,0.5936941 +10X_cells.TTTACTGAGCCAACAG-L8TX_180829_01_D09,3.871556,1.7289197 +10X_cells.GGGAGATAGTGGAGAA-L8TX_181011_01_G02,3.8621676,1.3718364 +10X_cells.ATGTGTGCAGCTGTTA-L8TX_181012_01_G04,6.885481,1.1308827 +10X_cells.CACACTCAGGTGCAAC-L8TX_181012_01_G04,3.8009794,1.6774801 +10X_cells.CTACATTTCTTACCGC-L8TX_180406_01_E02,4.514485,0.72428775 +10X_cells.CCATTCGGTCCCGACA-L8TX_171026_01_B05,6.8585687,0.34199926 +10X_cells.GACGGCTCAGTACACT-L8TX_171026_01_F05,6.033179,-0.9395245 +10X_cells.GCATGTAGTTTGACAC-L8TX_171026_01_B04,5.8703666,0.29796448 +10X_cells.TACCTATCATGCATGT-L8TX_171026_01_B04,6.3688865,2.297428 +10X_cells.ATAGACCAGTTACCCA-L8TX_171026_01_G04,7.4369698,0.15233842 +10X_cells.CGATTGATCGTCTGCT-L8TX_171026_01_H04,6.136105,0.24667479 +10X_cells.GAGTCCGGTCTTGCGG-L8TX_171026_01_H04,7.379489,-0.17118338 +10X_cells.TCACGAAAGTACCGGA-L8TX_171026_01_H04,7.6761537,0.021622615 +10X_cells.TTCTACATCTCCGGTT-L8TX_171026_01_H03,7.1038966,4.0321565 +10X_cells.GTCACGGGTAGGACAC-L8TX_171026_01_A04,7.134733,-0.7890538 +10X_cells.AACGTTGTCCCATTTA-L8TX_171026_01_D05,7.0091295,-0.6394937 +10X_cells.TCTGGAAAGCAGCGTA-L8TX_171026_01_E05,7.3404865,-1.2296668 +10X_cells.GCATACAGTACCGTTA-L8TX_181206_01_A12,7.6786566,-0.6340566 +Smartseq_cells.SM-GE66Y_S345_E1-50,7.3169785,0.5262404 +10X_cells.GGCGACTCATCTCCCA-L8TX_180221_01_E10,4.606346,-1.9786551 +10X_cells.AGCTCCTGTACTTGAC-L8TX_180221_01_D10,6.6237364,1.1353725 +10X_cells.CAGCCGATCCCACTTG-L8TX_180221_01_E10,7.1920443,0.33189204 +10X_cells.GGCTGGTTCCGCGGTA-L8TX_180221_01_F10,6.886828,-0.13671747 +10X_cells.GGGACCTAGTGTACTC-L8TX_180221_01_H10,7.271545,-0.44665557 +10X_cells.TAGTGGTTCTTAACCT-L8TX_180221_01_A11,4.42745,-0.009330895 +10X_cells.ACGCAGCAGTTATCGC-L8TX_190312_01_G02,5.700086,-1.0379525 +10X_cells.GTAGGCCCAGGTGCCT-L8TX_190312_01_G02,7.2084804,1.8234793 +10X_cells.ACGCCGAAGAAGGGTA-L8TX_181012_01_B05,5.2162185,2.0248475 +10X_cells.AGTAGTCCACACTGCG-L8TX_181012_01_B05,6.102421,1.7599521 +10X_cells.CGCGTTTAGAGATGAG-L8TX_180907_01_B12,7.0433726,-0.003338503 +10X_cells.TTCTTAGTCTGGAGCC-L8TX_180907_01_E11,6.2486534,-0.6249007 +10X_cells.TTCTTAGCAATAGAGT-L8TX_181011_01_H03,7.180438,0.28633118 +10X_cells.CGCGGTACAGGCTCAC-L8TX_180926_01_B01,8.567281,2.1879342 +10X_cells.GGAAAGCTCGTCCAGG-L8TX_180926_01_D01,5.487834,-1.4816031 +10X_cells.AAGGTTCCAATCTACG-L8TX_180926_01_F01,4.508854,0.91091144 +10X_cells.CTCTGGTGTTCAGACT-L8TX_180926_01_F01,4.3678026,0.9963923 +10X_cells.CAGCCGATCTGTCTCG-L8TX_181011_01_C03,3.7689564,1.7177296 +10X_cells.CTGCTGTAGGTAAACT-L8TX_180712_01_E05,6.050128,-1.0840901 +10X_cells.CCTTCCCTCCGGCACA-L8TX_180221_01_A12,8.043521,2.9155338 +10X_cells.TAGTGGTGTCATGCCG-L8TX_180712_01_E05,3.8517363,0.9690328 +10X_cells.TCTATTGCATGCAACT-L8TX_180712_01_E05,6.4489083,1.054352 +10X_cells.CAGAATCCAGCTTCGG-L8TX_180712_01_H05,7.5798864,3.1953864 +10X_cells.GAATAAGCAAGCGAGT-L8TX_180712_01_A06,7.184913,-0.15870333 +10X_cells.TCGCGTTGTGTCAATC-L8TX_180712_01_A06,6.4584618,1.8781554 +10X_cells.TGGACGCGTGCAGGTA-L8TX_180712_01_A06,6.404789,0.69021523 +10X_cells.GACGTTAGTTAGATGA-L8TX_180504_01_E01,3.9058151,1.3264471 +10X_cells.GGTATTGGTACGAAAT-L8TX_180504_01_E01,7.12339,1.8080677 +10X_cells.GCTGGGTAGTACTTGC-L8TX_180221_01_C12,5.9483895,1.7145498 +10X_cells.AAGTCTGCAAAGGAAG-L8TX_180221_01_D12,6.725272,1.9205528 +10X_cells.AGAGTGGGTAGCGTGA-L8TX_180221_01_H11,5.590991,1.5117993 +10X_cells.CACCAGGCAGACGCAA-L8TX_200611_02_A05,6.319332,0.041796148 +10X_cells.TCATTACTCCCTAACC-L8TX_200611_02_A05,5.8907294,1.8398716 +10X_cells.CACCTTGGTGGTCTCG-L8TX_180115_01_C11,6.6736383,0.44352728 +10X_cells.TAAGAGACAGCTGGCT-L8TX_180115_01_A11,5.906433,0.373467 +10X_cells.AGGGAGTCATTGAGCT-L8TX_180115_01_F10,5.6884737,0.6574414 +10X_cells.TTTACTGAGACTACAA-L8TX_180115_01_F10,8.259257,-0.09776835 +10X_cells.TACCTATGTATGAATG-L8TX_180115_01_F11,5.580636,-0.5516323 +10X_cells.TGATTTCGTCAATGTC-L8TX_180115_01_F11,6.1112905,0.26742345 +10X_cells.TTAGGACTCGCCAAAT-L8TX_180115_01_A10,4.935628,0.62955076 +10X_cells.CTCTGGTCAATCAGAA-L8TX_180115_01_E09,6.271179,1.5598097 +10X_cells.TGGCTGGCAGCCTGTG-L8TX_180115_01_E09,6.578921,1.150366 +10X_cells.AGGGATGGTCTTGTCC-L8TX_171120_01_G07,6.6002765,-0.52185225 +10X_cells.GGCCGATAGAGACGAA-L8TX_171120_01_G07,9.241524,-3.3144717 +10X_cells.TAGCCGGAGATCCCGC-L8TX_171120_01_H07,7.0505137,0.20569049 +10X_cells.TTCTCCTCAATAGCAA-L8TX_171120_01_C07,7.0043,-0.21179205 +10X_cells.TTCCCAGGTATCGCAT-L8TX_180115_01_C08,5.236955,0.4489413 +Smartseq_cells.LS-15007_S53_E1-50,7.1177564,-0.24195738 +Smartseq_cells.LS-15011_S08_E1-50,6.6933236,-0.34144413 +Smartseq_cells.LS-15577_S60_E1-50,6.590529,0.016494127 +Smartseq_cells.SM-GE94L_S075_E1-50,6.458805,-0.8431087 +10X_cells.CGCCAAGGTTATTCTC-L8TX_180221_01_F09,7.947796,-1.4302189 +10X_cells.ATCACGACAGACAGGT-L8TX_180221_01_H09,6.1417313,-1.3987663 +10X_cells.TAGTTGGAGATGTGTA-L8TX_180221_01_B10,6.779929,-2.6417592 +10X_cells.CCTATTACAATGCCAT-L8TX_180221_01_C10,7.257251,-0.0773857 +10X_cells.TGTGTTTCACGGATAG-L8TX_180406_01_F02,6.6991806,2.6755497 +10X_cells.GCTGCTTAGTGTGAAT-L8TX_180221_01_C09,8.513129,-2.3005013 +10X_cells.AGGGTGAAGAAGATTC-L8TX_180221_01_D09,5.6270113,0.94747436 +Smartseq_cells.SM-D9D9E_S03_E1-50,7.3300037,-0.08358088 +10X_cells.ACAGCTAGTTCACCTC-L8TX_180829_01_E10,6.8929935,-0.6054458 +10X_cells.CACACAACACGCATCG-L8TX_180907_01_F10,5.9806185,-0.54084074 +10X_cells.GGAACTTGTACAAGTA-L8TX_180907_01_F10,6.5237846,-0.49160287 +10X_cells.ATCTACTTCACAATGC-L8TX_180907_01_G10,6.5501194,-0.47337046 +Smartseq_cells.SM-GE5VC_S373_E1-50,7.5161357,-0.65494555 +10X_cells.ACACCCTAGTGGTCCC-L8TX_171026_01_H05,6.9589005,-0.8464815 +10X_cells.CACCAGGTCGTCGTTC-L8TX_171026_01_F05,10.056995,-3.4521322 +10X_cells.CTGTGCTGTAGAGGAA-L8TX_171026_01_F03,7.5958643,1.5165194 +10X_cells.GGGTTGCCATAGAAAC-L8TX_171026_01_B04,6.6534505,-1.0118059 +10X_cells.CGACCTTAGGTAAACT-L8TX_171026_01_F04,7.4413285,-1.0928917 +10X_cells.GCACTCTCAACAACCT-L8TX_171026_01_F04,7.1463428,-1.6591679 +10X_cells.TCACGAAGTCGCATCG-L8TX_171026_01_B05,8.802843,-3.5263267 +10X_cells.CGCTGGAGTAGTGAAT-L8TX_171026_01_H04,6.771869,-0.61331517 +10X_cells.CTACCCAAGCGCCTTG-L8TX_171026_01_A05,7.538411,-1.2171692 +10X_cells.GACCAATTCGTAGATC-L8TX_171026_01_A05,5.5582323,3.7747266 +10X_cells.AGCGTCGCATTCGACA-L8TX_171026_01_H03,10.678347,-2.5868292 +10X_cells.CGCCAAGGTAGCGCAA-L8TX_171026_01_A04,7.150761,-1.205897 +10X_cells.CCTCAGTCAGCTTCGG-L8TX_171026_01_D05,5.9611354,-0.47407943 +10X_cells.CATATTCTCACATAGC-L8TX_171026_01_F05,7.3132696,-1.062363 +10X_cells.CGCCAAGTCCGAAGAG-L8TX_171026_01_F05,6.899315,0.44699672 +10X_cells.TCGAGGCCAGGTCTCG-L8TX_181206_01_B12,6.6226983,-0.33561072 +10X_cells.GACTACATCCGTTGCT-L8TX_181206_01_D12,7.0294685,-1.7182066 +Smartseq_cells.SM-GE67N_S188_E1-50,7.050402,-0.4857992 +10X_cells.CCTTCCCCACCAGGTC-L8TX_180221_01_D10,7.4917517,-1.1025643 +10X_cells.GTCACAACAAGCTGGA-L8TX_180221_01_F10,3.8063848,0.5659892 +10X_cells.CACTCCACAAGCGTAG-L8TX_180221_01_A11,6.0540857,-0.9494415 +10X_cells.GTGTTAGAGACTGGGT-L8TX_180221_01_A11,6.821809,-0.73087555 +10X_cells.CAGCGACAGTGGTAAT-L8TX_190312_01_C02,5.6717863,-0.8595018 +10X_cells.TGACGGCAGCTGAAAT-L8TX_180907_01_B11,6.1706867,-0.3570699 +10X_cells.CGGACTGCAGGGATTG-L8TX_181012_01_B05,6.2734213,-1.3449185 +10X_cells.CGTGTCTCATCGACGC-L8TX_181012_01_C05,9.134182,-0.27601027 +10X_cells.TACCTTAAGAGACGAA-L8TX_181012_01_C05,6.2971373,-0.15288857 +10X_cells.TCTTTCCGTCGAAAGC-L8TX_180221_01_D11,9.954036,-2.2766461 +10X_cells.CGGACTGCACGGTAGA-L8TX_180221_01_D11,7.970706,0.3491243 +10X_cells.AACTCCCCACGGTAAG-L8TX_180221_01_F11,12.566407,-1.4984212 +10X_cells.GACACGCTCGGAAACG-L8TX_180221_01_F11,7.5627837,-0.9927425 +10X_cells.GGCGACTGTCCGTGAC-L8TX_180221_01_F11,4.9728723,0.13478298 +10X_cells.TAGGCATCAAGCGATG-L8TX_180907_01_H11,7.4691806,-1.213677 +10X_cells.GGCCGATGTATTAGCC-L8TX_180907_01_E11,6.9944334,1.7856717 +10X_cells.ATCCGAAGTGAGGGAG-L8TX_180907_01_F11,5.7086887,-0.44628286 +10X_cells.CGATGTACAGGTCCAC-L8TX_180907_01_F11,7.245177,-1.3953034 +10X_cells.TTAGGCAGTGTAAGTA-L8TX_180115_01_G11,6.99102,0.43670034 +10X_cells.AAGGTTCTCCGTTGTC-L8TX_180115_01_F10,7.319128,-0.7756348 +10X_cells.GTAACTGAGGCTCAGA-L8TX_180115_01_B09,6.3403907,-1.1746604 +10X_cells.ACGAGGATCTTGCCGT-L8TX_180115_01_D10,5.2572827,0.45884606 +10X_cells.CACCTTGCAACGATGG-L8TX_180115_01_D10,11.883875,-1.207903 +10X_cells.ACAGCCGGTCATCCCT-L8TX_180115_01_A11,6.0127044,-0.5280914 +10X_cells.TGTTCCGCAGTAACGG-L8TX_180115_01_B11,7.3312974,-0.22838184 +10X_cells.CTTAGGATCCTAGGGC-L8TX_180115_01_D11,9.839438,-3.2135892 +10X_cells.GCGACCAGTAGCGATG-L8TX_180115_01_D11,6.777952,-0.7149492 +10X_cells.GGTGCGTGTTCAGACT-L8TX_180115_01_D11,6.0047255,0.037951875 +10X_cells.GGACATTCAATGGACG-L8TX_180115_01_E10,5.1703897,0.10162843 +10X_cells.ATCATGGTCTCGATGA-L8TX_180115_01_F10,7.1377745,1.5896585 +10X_cells.ACTTGTTAGCAACGGT-L8TX_180115_01_G10,5.7015686,0.34937376 +10X_cells.AGGGTGATCCAAATGC-L8TX_180115_01_E11,6.925429,-0.32293075 +10X_cells.GATCAGTCACCAGGCT-L8TX_180115_01_F11,7.7685685,1.0094343 +10X_cells.TGGGCGTCAATCCGAT-L8TX_180115_01_F11,7.4420576,-0.9439582 +10X_cells.AACTGGTCAGCTCCGA-L8TX_180115_01_G11,6.8739357,-0.87315655 +10X_cells.CGTAGGCAGATATGGT-L8TX_180115_01_H09,5.2042103,0.4375071 +10X_cells.CATGACATCACCGTAA-L8TX_180115_01_E09,5.382005,-1.7745173 +10X_cells.GGGTCTGTCTGTCTCG-L8TX_180115_01_F09,5.2496567,0.07359368 +10X_cells.AGCGTATCAAGGACTG-L8TX_171120_01_G07,7.259187,-0.29611424 +10X_cells.CCCATACTCAGCTCGG-L8TX_171120_01_C07,5.388511,-0.29272303 +10X_cells.CGCGGTATCCGCATAA-L8TX_171120_01_F07,7.5110536,-0.32388213 +Smartseq_cells.LS-15021_S90_E1-50,6.133934,-0.9759407 +Smartseq_cells.LS-15097_S08_E1-50,6.175519,-0.9004445 +Smartseq_cells.SM-GE91G_S088_E1-50,7.991018,-0.49657002 +Smartseq_cells.SM-GE91L_S221_E1-50,6.5334854,-0.11948416 +Smartseq_cells.SM-GE91C_S053_E1-50,7.7839656,-1.0342169 +Smartseq_cells.SM-GE91C_S060_E1-50,6.190069,0.18016772 +Smartseq_cells.SM-GE91C_S332_E1-50,6.4294558,-0.18516082 +Smartseq_cells.SM-GE91H_S274_E1-50,8.625044,0.40640014 +Smartseq_cells.SM-GE91J_S248_E1-50,7.1970844,-0.15635134 +Smartseq_cells.SM-GE91J_S253_E1-50,11.338936,12.01775 +Smartseq_cells.SM-GE914_S165_E1-50,8.871065,-1.2082171 +Smartseq_cells.SM-GE915_S072_E1-50,6.5124946,0.09387748 +10X_cells.GTATCTTGTCTCAACA-L8TX_180221_01_B10,9.735478,-0.63529724 +10X_cells.AGAGCGATCGCACTCT-L8TX_180221_01_H09,10.590077,0.27659178 +10X_cells.TACTCATCAGGGTATG-L8TX_180221_01_H09,9.685686,-0.09195498 +10X_cells.CTAGCCTCAAACTGCT-L8TX_180221_01_A10,8.825935,-0.035994846 +10X_cells.GCCAAATGTGCTGTAT-L8TX_180221_01_B10,9.670849,0.102191746 +10X_cells.ATCTACTTCCGCTGTT-L8TX_180221_01_C10,8.328999,-0.32707086 +10X_cells.GCATGATCACATTAGC-L8TX_180221_01_C10,9.639613,-0.20321165 +10X_cells.ACTTACTCACATTTCT-L8TX_180406_01_F02,8.1777725,-0.021700706 +10X_cells.CACACTCTCGCCAAAT-L8TX_180406_01_C06,11.527106,-1.146641 +10X_cells.CGTCAGGAGACAGACC-L8TX_180221_01_D09,9.036012,-0.19394909 +10X_cells.AAAGCAAGTATAGGGC-L8TX_180607_01_C05,8.3524885,-0.8026314 +10X_cells.ATCTACTAGAAGGTTT-L8TX_180712_01_G05,8.487225,-0.054779 +10X_cells.CCCATACTCTAACTGG-L8TX_180712_01_B06,7.6854506,-1.2871569 +10X_cells.TTTGGTTCACGTAAGG-L8TX_180712_01_B06,9.091139,-0.9071383 +Smartseq_cells.LS-15012_S43_E1-50,9.25262,-1.0473282 +Smartseq_cells.LS-15014_S21_E1-50,7.979383,-0.9048429 +Smartseq_cells.LS-15338_S28_E1-50,8.17774,-0.3734351 +Smartseq_cells.SM-GE64C_S005_E1-50,8.638856,-1.0271722 +10X_cells.CAAGGCCTCCTGCTTG-L8TX_180829_01_D09,10.699473,0.5172094 +10X_cells.CGATGGCAGACTGGGT-L8TX_180829_01_E10,10.182796,0.52725345 +10X_cells.CTCGAAACACGAGGTA-L8TX_180829_01_E10,8.950536,-0.4615625 +10X_cells.AGGGTGAAGCTAAGAT-L8TX_180907_01_F10,8.534405,0.06021654 +10X_cells.CAGAATCCACTACAGT-L8TX_181011_01_H02,10.912211,-0.74843705 +10X_cells.GTCGTAAAGGCTCTTA-L8TX_181011_01_H02,9.110773,-1.0091003 +10X_cells.CACACCTCAGTTAACC-L8TX_181011_01_C04,10.603971,0.70129603 +10X_cells.CACCTTGTCTTAACCT-L8TX_181011_01_C04,8.975552,-0.7989606 +10X_cells.ACGCCAGGTTATGCGT-L8TX_181012_01_G04,11.029396,1.0156628 +10X_cells.ACGTCAAAGCGAGAAA-L8TX_181012_01_G04,11.248352,0.3877818 +10X_cells.CCACGGAAGGTAGCCA-L8TX_181012_01_G04,10.145941,0.10353844 +10X_cells.CTGCGGACAACACCTA-L8TX_181012_01_G04,10.51006,-0.1829946 +10X_cells.GATCGTAAGCGTCTAT-L8TX_181012_01_G04,11.387404,-0.09933186 +10X_cells.TCAGATGGTGTGAAAT-L8TX_181012_01_G04,10.029876,-0.3750158 +10X_cells.TGCGCAGAGTTACGGG-L8TX_181012_01_G04,10.55134,0.31011578 +10X_cells.AGACGTTAGACCTAGG-L8TX_181012_01_H04,11.366706,0.6368542 +Smartseq_cells.SM-GE5VB_S118_E1-50,9.5441,-2.1395924 +10X_cells.GAATAAGTCGGAGCAA-L8TX_171026_01_A05,8.881571,-0.6599894 +10X_cells.CATTCGCTCAGGCGAA-L8TX_171026_01_A05,7.708513,-0.26089895 +10X_cells.ACTGCTCAGAACTCGG-L8TX_171026_01_A04,8.565996,-0.07233614 +10X_cells.CACAGTAGTTGTGGAG-L8TX_171026_01_B04,8.381197,-0.8047446 +10X_cells.AAGACCTCAAGGTTCT-L8TX_171026_01_F03,8.385049,-0.8807842 +10X_cells.GGGCACTAGGGCTTCC-L8TX_171026_01_F03,10.632069,0.47286674 +10X_cells.ATCTGCCAGGGAGTAA-L8TX_171026_01_B04,9.429832,-0.08285901 +10X_cells.CCTATTAGTAGGGACT-L8TX_171026_01_G04,8.491881,-0.2728503 +10X_cells.CGCTATCTCCGATATG-L8TX_171026_01_G04,9.74161,-2.2343488 +10X_cells.GGGTCTGCACAGACAG-L8TX_171026_01_G04,8.234137,0.94820774 +10X_cells.GTTAAGCGTGCACGAA-L8TX_171026_01_G04,8.363139,-0.26964417 +10X_cells.GGATTACTCCGGGTGT-L8TX_171026_01_B05,9.006734,-2.2788687 +10X_cells.GATCTAGGTTTGGCGC-L8TX_171026_01_H04,10.370501,0.8985258 +10X_cells.CTCCTAGGTGTTCGAT-L8TX_171026_01_H03,10.686512,-0.5103674 +10X_cells.GCTGCAGGTTCCGTCT-L8TX_171026_01_H03,10.034208,-0.11263682 +10X_cells.TAGACCAGTCTTCTCG-L8TX_171026_01_H03,8.891351,-0.89213413 +10X_cells.TGCCCATAGCACGCCT-L8TX_171026_01_H03,9.896357,-0.45152962 +10X_cells.AACCATGCATCTACGA-L8TX_171026_01_A04,9.488146,-1.4261237 +10X_cells.CTGAAACCAAGCCCAC-L8TX_171026_01_D05,9.5793295,0.06924857 +10X_cells.CACACAAGTTGGTAAA-L8TX_171026_01_E05,9.268135,-0.81895876 +10X_cells.CAGCAGCGTCGGCTCA-L8TX_171026_01_E05,10.302212,-0.5462693 +10X_cells.GACCAATTCTCAACTT-L8TX_171026_01_E05,8.877543,0.1615191 +Smartseq_cells.SM-DD44A_S25_E1-50,8.65553,-0.15712099 +10X_cells.ATCTACTTCTAAGCCA-L8TX_181206_01_F12,10.645809,0.38595358 +10X_cells.GGACGTCGTAGGCTGA-L8TX_181206_01_F12,10.715028,0.8402134 +10X_cells.TCGTAGAGTATGCTTG-L8TX_181206_01_E12,10.012784,-0.19544616 +10X_cells.CAACCTCGTCGACTAT-L8TX_180221_01_D10,7.8821774,0.36110246 +10X_cells.AAAGCAATCCTCGCAT-L8TX_180221_01_F10,9.699546,0.12134884 +10X_cells.AAGACCTTCACAGGCC-L8TX_180221_01_F10,8.625596,-0.22153975 +10X_cells.CGGTTAAAGGCATGGT-L8TX_180221_01_F10,7.1516027,-0.055142816 +10X_cells.GCGAGAATCCGGCACA-L8TX_180221_01_F10,10.795418,0.22071056 +10X_cells.TGTGTTTGTGCACTTA-L8TX_180221_01_F10,11.414265,0.4760302 +10X_cells.TGCCCATCAGCCAGAA-L8TX_180221_01_A11,8.426058,-0.26420072 +10X_cells.CGAATGTTCACTTACT-L8TX_190312_01_B02,9.957917,0.23815414 +10X_cells.CTAGTGATCCTTGCCA-L8TX_190312_01_G02,11.680313,0.81825393 +10X_cells.AAGACCTCACGGCTAC-L8TX_180907_01_B11,11.053898,1.0934213 +10X_cells.TACAGTGGTTTGTGTG-L8TX_180926_01_C12,9.549053,0.68817544 +10X_cells.TGAGAGGGTTGTCTTT-L8TX_180926_01_C12,10.11251,0.44603488 +10X_cells.CCGTTCACATCGTCGG-L8TX_180926_01_E12,8.871294,-0.92968875 +10X_cells.GGGAGATCACCAGCAC-L8TX_181012_01_C05,7.9514484,-0.84969074 +10X_cells.TACTCGCAGTGTGAAT-L8TX_181012_01_C05,10.563615,0.46781477 +10X_cells.TCAGGTATCTCTGAGA-L8TX_181012_01_C05,10.373144,-0.6234487 +10X_cells.ACATCAGTCTACTCAT-L8TX_180221_01_C11,11.478881,-0.043928254 +10X_cells.CACCAGGCAATTGCTG-L8TX_180221_01_D11,10.134029,0.93783045 +10X_cells.TGGCTGGTCATGTCCC-L8TX_180221_01_D11,11.588159,0.9517945 +10X_cells.AAACGGGAGACCGGAT-L8TX_180221_01_G11,10.380847,0.59683037 +10X_cells.TCACAAGTCTAACGGT-L8TX_190312_01_F02,8.057823,-0.75029695 +Smartseq_cells.SM-GE67Q_S239_E1-50,8.642335,-0.97815466 +10X_cells.CTTAGGAGTCTAGCGC-L8TX_180907_01_H11,7.1165953,1.5314989 +10X_cells.AGCTCCTAGCGCCTTG-L8TX_180907_01_A12,10.01856,-2.556357 +10X_cells.GTCGGGTTCGAGCCCA-L8TX_180907_01_A12,7.502683,0.47361463 +10X_cells.CACCAGGGTGTGACCC-L8TX_180907_01_F11,8.358621,4.629094 +Smartseq_cells.SM-GE5US_S301_E1-50,7.8076286,-0.5493647 +10X_cells.AGGCCACCATGAAGTA-L8TX_180926_01_D01,10.096961,0.31470925 +10X_cells.CTCGAAAAGAATGTGT-L8TX_180926_01_F01,9.992332,-0.076265156 +10X_cells.TAAACCGGTGTGACGA-L8TX_181011_01_C03,9.928074,-0.07786206 +10X_cells.CCTCAGTGTAAGCACG-L8TX_180712_01_E05,9.747524,-0.10007142 +10X_cells.CCTCTGAGTTCTCATT-L8TX_180712_01_H05,11.012864,0.44293198 +10X_cells.CCACTACAGGTCGGAT-L8TX_180504_01_E01,9.450383,0.35359564 +10X_cells.TGTATTCGTCAGCTAT-L8TX_180221_01_A12,11.23027,1.1385787 +10X_cells.TTTGGTTCAATGGTCT-L8TX_180221_01_A12,11.627361,2.4696298 +10X_cells.GCATACAAGGGTTTCT-L8TX_180221_01_H11,11.525201,2.644814 +10X_cells.ACGGGCTTCCAACCAA-L8TX_200611_02_A05,10.706495,1.0330616 +10X_cells.CATCAGAGTGATAAGT-L8TX_180115_01_G11,9.058858,0.071932144 +10X_cells.CTCGTACAGCTACCGC-L8TX_180115_01_H10,10.673243,0.48946896 +10X_cells.GGTGCGTGTTATCCGA-L8TX_180115_01_C11,10.363447,0.44785288 +10X_cells.AACTTTCAGGGCTCTC-L8TX_180115_01_A11,10.188713,-0.68538034 +10X_cells.TGTGGTAGTCTCATCC-L8TX_180115_01_G11,9.152873,-0.9735303 +10X_cells.GGCGACTAGGCCCGTT-L8TX_180115_01_H11,8.877797,0.10301924 +10X_cells.AGCATACCATGGATGG-L8TX_180115_01_E10,8.684413,1.2584587 +10X_cells.TTGCGTCTCAGAGCTT-L8TX_180115_01_F11,8.869976,-0.5598924 +10X_cells.TGGGCGTTCATGCAAC-L8TX_180115_01_D11,11.295819,0.5634726 +10X_cells.TTTACTGTCGCTTAGA-L8TX_180115_01_G11,8.922965,0.12469615 +10X_cells.AAGGAGCCACCAACCG-L8TX_180115_01_E10,10.527237,0.6682878 +10X_cells.ACTGATGGTTCAGACT-L8TX_180115_01_E10,10.004193,0.22566035 +10X_cells.AACTCAGAGAATGTGT-L8TX_180115_01_C11,8.503335,-0.39225557 +10X_cells.AGATCTGCAAAGAATC-L8TX_180115_01_B11,11.0686865,0.2843707 +10X_cells.TTCGAAGTCCACGTTC-L8TX_180115_01_H11,9.9874,0.046722755 +10X_cells.CTCGTCACACCAGATT-L8TX_180115_01_F11,9.301916,0.20095849 +10X_cells.ATCTACTTCCTCGCAT-L8TX_180115_01_F10,10.190223,0.43875337 +10X_cells.CGCTATCTCTGATACG-L8TX_180115_01_G11,9.385634,0.75119764 +10X_cells.ATGGGAGCAGATGGGT-L8TX_180115_01_F09,10.189402,0.6459625 +10X_cells.AGAATAGGTTGCGCAC-L8TX_180115_01_G10,10.513775,-0.32408777 +10X_cells.AGATTGCCATCCGCGA-L8TX_180115_01_F11,8.836662,-0.76840407 +10X_cells.ATGGGAGTCCACGCAG-L8TX_180115_01_A10,11.521323,1.1996945 +10X_cells.ATGTGTGGTGCGAAAC-L8TX_180115_01_H10,7.73036,1.764106 +10X_cells.TGGACGCTCAGCTCGG-L8TX_180115_01_D11,9.610329,-0.8686635 +10X_cells.AGGGATGGTTGTCTTT-L8TX_180115_01_F09,12.226784,0.24257885 +10X_cells.ACGTCAAAGCAGATCG-L8TX_180115_01_C11,10.872478,0.105225384 +10X_cells.AAGCCGCGTACAGACG-L8TX_180115_01_D11,8.885174,-0.7194622 +10X_cells.AATCGGTAGGCTCTTA-L8TX_180115_01_B11,8.114743,1.1785278 +10X_cells.CTACGTCAGATCTGAA-L8TX_180115_01_C11,12.434753,0.14374427 +10X_cells.ACGGGTCGTATATCCG-L8TX_180115_01_D09,10.252967,0.5772955 +10X_cells.CGATGGCGTGCACTTA-L8TX_180115_01_E11,9.199887,-0.6540765 +10X_cells.GTAACTGAGTACATGA-L8TX_180115_01_F09,10.759965,0.41132763 +10X_cells.CGTTCTGCATGCATGT-L8TX_180115_01_G10,9.812834,-0.3414542 +10X_cells.CATCAGAGTGTGGTTT-L8TX_180115_01_B09,9.733182,0.7701465 +10X_cells.TACTCGCGTTGTTTGG-L8TX_180115_01_F11,10.328418,-0.35041368 +10X_cells.TAGAGCTAGCATGGCA-L8TX_180115_01_C09,10.9076185,0.5911646 +10X_cells.CATTATCCAGTAAGCG-L8TX_180115_01_G10,10.705311,0.14713524 +10X_cells.GCGCAACGTGCACCAC-L8TX_180115_01_D11,8.102134,0.32834274 +10X_cells.CATTATCTCTAACTGG-L8TX_180115_01_B11,8.068438,0.8383357 +10X_cells.CTCGAAAAGGTGCTTT-L8TX_180115_01_E11,11.717227,0.015576691 +10X_cells.ACATGGTCATCGGAAG-L8TX_180115_01_D11,8.528253,0.29168132 +10X_cells.ACCAGTAGTCCGCTGA-L8TX_180115_01_D11,8.150403,-0.17907941 +10X_cells.GGTGTTAGTCTAGCGC-L8TX_180115_01_D11,11.137972,0.400082 +10X_cells.TCAATCTTCATTGCGA-L8TX_180115_01_C09,10.139567,0.79722154 +10X_cells.GACGTGCAGGGCTTCC-L8TX_180115_01_A11,8.443755,-0.574589 +10X_cells.GAATAAGCAGTCCTTC-L8TX_180115_01_G10,10.843657,0.74401575 +10X_cells.GAACATCCACCTGGTG-L8TX_180115_01_A09,8.836177,-0.052703716 +10X_cells.GCGAGAAAGACTTTCG-L8TX_180115_01_D11,11.239141,0.4342165 +10X_cells.TGTTCCGGTCAAACTC-L8TX_180115_01_F10,8.788419,-0.7652036 +10X_cells.CCATGTCTCATACGGT-L8TX_180115_01_H10,10.618087,0.33187914 +10X_cells.TGGTTAGCATGCATGT-L8TX_171120_01_G07,9.411223,2.88E-05 +10X_cells.CTCGTCAAGGACACCA-L8TX_171120_01_H07,8.74404,0.008725954 +10X_cells.ACCGTAATCAACACCA-L8TX_180115_01_G08,8.456426,0.6340833 +10X_cells.TCTTCGGTCTCCAGGG-L8TX_180115_01_G08,9.305797,-0.13448146 +10X_cells.GTGCATAAGCATCATC-L8TX_171120_01_D07,9.094975,0.8889604 +10X_cells.TGGTTCCGTCCAGTGC-L8TX_171120_01_D07,8.528837,0.64183307 +10X_cells.GTGCGGTGTTCTGGTA-L8TX_180115_01_H08,9.122312,-0.018987427 +10X_cells.CAACCTCCAGGGTACA-L8TX_171120_01_D07,9.256339,-0.8830968 +10X_cells.CACCAGGTCTGTACGA-L8TX_171120_01_D07,9.344671,-1.1910251 +10X_cells.TCTGAGAAGCCAGTAG-L8TX_171120_01_D07,10.274324,0.43297127 +Smartseq_cells.LS-15000_S51_E1-50,8.132928,-0.6380179 +Smartseq_cells.LS-15001_S33_E1-50,8.6407795,-0.062030327 +Smartseq_cells.LS-15065_S45_E1-50,8.039592,-0.24846676 +Smartseq_cells.LS-15066_S61_E1-50,8.823089,-0.39625672 +Smartseq_cells.LS-15398_S89_E1-50,8.241831,0.10459004 +Smartseq_cells.SM-D9EP5_S76_E1-50,9.682805,-2.358332 +Smartseq_cells.SM-DD45L_S083_E1-50,8.136576,0.39437643 +Smartseq_cells.SM-DD45L_S091_E1-50,8.738368,-0.926192 +Smartseq_cells.SM-GE631_S133_E1-50,9.188532,-1.822134 +Smartseq_cells.SM-GE64U_S078_E1-50,9.346007,-2.4431753 +10X_cells.TACCTTACATCTGGTA-L8TX_180221_01_F09,10.954517,-2.6330075 +10X_cells.TCTGAGATCATGCAAC-L8TX_180712_01_G05,9.988903,-0.65333384 +10X_cells.GGAAAGCTCACGATGT-L8TX_180221_01_E09,11.766862,-3.9525259 +10X_cells.CTCGTCACACATGTGT-L8TX_180712_01_G05,10.724203,-2.6985316 +10X_cells.CTACGTCCAGCTGCAC-L8TX_180221_01_H12,12.8498535,-3.190654 +10X_cells.CTGATAGCACGAGGTA-L8TX_180221_01_E09,11.154803,-2.7692401 +10X_cells.GCGAGAAAGTCAAGGC-L8TX_180221_01_C09,11.019028,0.046109926 +10X_cells.ATTTCTGAGGGTTTCT-L8TX_180221_01_D09,12.483438,-3.1496816 +10X_cells.CTGTTTATCCTTTCTC-L8TX_180221_01_D09,11.112375,-3.1686428 +10X_cells.TACTCGCTCTTACCGC-L8TX_180221_01_D09,10.665127,0.4329821 +10X_cells.TCAGGTAAGGACTGGT-L8TX_180712_01_G05,10.605242,-3.005474 +10X_cells.TCAACGATCGGTCCGA-L8TX_180712_01_B06,11.826695,-3.5366094 +Smartseq_cells.LS-15320_S67_E2-50,10.964789,-2.7951944 +Smartseq_cells.LS-15361_S22_E1-50,10.316627,-2.2573802 +Smartseq_cells.SM-GE631_S034_E1-50,11.1939745,-2.7684453 +Smartseq_cells.SM-GE64C_S004_E1-50,10.413803,-2.0975578 +10X_cells.TTCCCAGTCGACCAGC-L8TX_180907_01_F10,11.588271,-2.721022 +10X_cells.CCTATTATCTTACCGC-L8TX_181011_01_H02,10.746937,-2.6030145 +10X_cells.TGCTGCTTCACGATGT-L8TX_181011_01_C04,13.216912,-0.25005895 +10X_cells.CGTCACTGTGAGGCTA-L8TX_181012_01_G04,11.954008,-0.64797944 +10X_cells.ACGGGCTTCGGCGCAT-L8TX_181012_01_H04,11.447396,-1.1953353 +10X_cells.TACGGTAGTGCTCTTC-L8TX_181012_01_H04,11.892726,-0.64563614 +10X_cells.GTGTTAGCACAGTCGC-L8TX_181012_01_E05,11.7062,-1.4701338 +10X_cells.GTCCTCACAAGACGTG-L8TX_180406_01_C08,10.793283,1.5001749 +10X_cells.AACGTTGAGTTCGCAT-L8TX_171026_01_A05,10.651996,-3.0245292 +10X_cells.AAAGTAGTCGCCAGCA-L8TX_171026_01_G03,10.110957,-0.35753188 +10X_cells.CAACCTCAGGGTCGAT-L8TX_171026_01_B04,10.762976,-2.7306485 +10X_cells.GGAGCAATCTGCGGCA-L8TX_171026_01_B04,11.692575,-0.35807422 +10X_cells.TTCTCCTGTTCACGGC-L8TX_171026_01_B04,12.166739,-4.4701324 +10X_cells.AGTTGGTCACCATGTA-L8TX_171026_01_F04,9.663381,-2.0859857 +10X_cells.ATCCACCTCAGAAATG-L8TX_171026_01_G04,10.141655,-2.072584 +10X_cells.AACCATGAGTACTTGC-L8TX_171026_01_H04,9.942831,-0.7124814 +10X_cells.GGCGTGTAGAGTACCG-L8TX_171026_01_H04,12.421882,-2.3915472 +10X_cells.ACGATGTAGAAGGGTA-L8TX_171026_01_H03,11.530906,-2.713127 +10X_cells.GAAGCAGAGAGAACAG-L8TX_171026_01_H03,10.702155,-3.0563083 +10X_cells.GCAGTTAGTCGGCTCA-L8TX_171026_01_H03,14.122186,-2.0307662 +10X_cells.CAAGGCCAGAATGTTG-L8TX_171026_01_A04,10.002382,-1.6181741 +10X_cells.CCTCTGACATTCTCAT-L8TX_171026_01_A04,11.741686,-4.1302757 +10X_cells.CACCAGGCAAAGTGCG-L8TX_171026_01_D05,11.019974,-1.9227904 +10X_cells.CAGTAACCACTGAAGG-L8TX_171026_01_E05,10.548366,-1.9397054 +10X_cells.CTCACACTCGCCCTTA-L8TX_171026_01_E05,12.312632,-2.8649027 +10X_cells.CTTACCGCACAAGCCC-L8TX_171026_01_E05,12.20541,-2.9548979 +10X_cells.GACGGCTTCAACCAAC-L8TX_171026_01_E05,12.164277,-3.544149 +10X_cells.CACCTTGCAAAGGAAG-L8TX_171026_01_G05,12.302548,-2.9192343 +Smartseq_cells.SM-GE935_S208_E1-50,11.596631,-3.1357667 +Smartseq_cells.SM-GE8ZJ_S384_E1-50,11.793678,-3.5278578 +Smartseq_cells.SM-GE67N_S365_E1-50,10.514924,-2.3416421 +10X_cells.TCCACACTCAGTACGT-L8TX_180221_01_E10,10.806965,-0.6966725 +10X_cells.TCTTTCCTCAAACCAC-L8TX_180221_01_D10,8.834963,-1.3098651 +10X_cells.GTTTCTAGTGTCAATC-L8TX_180221_01_E10,11.014692,0.5061105 +10X_cells.TGGCGCAGTCTAACGT-L8TX_180221_01_E10,10.314356,1.3813162 +10X_cells.GTAACTGTCAAACGGG-L8TX_180221_01_F10,10.846188,-2.1690817 +10X_cells.TGTTCCGAGAGAACAG-L8TX_180221_01_F10,11.416363,-3.255314 +10X_cells.AGCTCTCTCGATCCCT-L8TX_180221_01_H10,10.463109,-2.4546518 +10X_cells.GCAGCCAAGGGATGGG-L8TX_180221_01_A11,12.063223,-3.9459264 +10X_cells.GCATGCGCACAGCCCA-L8TX_190312_01_B02,11.44311,-3.742338 +10X_cells.TTCGGTCCAGTGGAGT-L8TX_190312_01_C02,11.443275,-3.6726034 +10X_cells.AGAGCTTAGTCCCACG-L8TX_190312_01_G02,10.806703,-3.1163547 +10X_cells.AAGGAGCGTTGTCGCG-L8TX_180907_01_B11,11.578378,-1.3619864 +10X_cells.AGATCTGCATATACGC-L8TX_180907_01_B11,11.621654,-2.4505606 +10X_cells.ATGTGTGTCAGTACGT-L8TX_180907_01_B11,11.5512905,-0.30212316 +10X_cells.GGACATTGTGTAAGTA-L8TX_180926_01_C12,12.774463,-3.5627646 +10X_cells.GACTAACTCCCAAGAT-L8TX_180926_01_E12,11.148009,-3.5036862 +Smartseq_cells.SM-GE8Y3_S216_E1-50,10.933848,-2.067474 +10X_cells.CCTTCGAGTCTAGTCA-L8TX_180221_01_C11,12.436537,-2.1941876 +10X_cells.AAGGTTCGTCAGAATA-L8TX_180907_01_G11,11.163387,-2.4336147 +10X_cells.CACACAAGTGCTTCTC-L8TX_180907_01_H11,11.521147,-1.3130745 +10X_cells.CGGGTCAGTTCTGTTT-L8TX_180907_01_A12,13.596733,-2.6906528 +10X_cells.CCATGTCTCAACACCA-L8TX_180907_01_E11,12.178994,-1.3961432 +10X_cells.CGAGCCACATATACGC-L8TX_180907_01_F11,12.679474,-3.7498899 +Smartseq_cells.SM-GE5US_S318_E1-50,9.966326,-2.2718782 +10X_cells.TCGCGTTGTCAGATAA-L8TX_180926_01_B01,13.68453,-2.7030349 +10X_cells.GCGCGATCATTGTGCA-L8TX_180926_01_E01,10.832326,1.6028532 +10X_cells.ATGGGAGCACGCCAGT-L8TX_180926_01_F01,11.783269,-0.8189382 +10X_cells.GAATAAGCAGATGGCA-L8TX_180926_01_F01,11.5301695,-0.2780556 +10X_cells.ATTACTCGTAGCAAAT-L8TX_181011_01_B03,11.813037,-3.3044024 +10X_cells.CCGGGATGTTACGGAG-L8TX_181011_01_B03,11.286082,-1.3067273 +10X_cells.ACGCCAGCAAGTAATG-L8TX_181011_01_C03,12.110542,-1.3566551 +10X_cells.CACCACTAGCGTAATA-L8TX_181011_01_C03,10.952752,-0.22994596 +10X_cells.GTTACAGCAAGTCTGT-L8TX_181011_01_C03,11.458296,-0.36959854 +10X_cells.TCTGAGAAGGCAGTCA-L8TX_181011_01_C03,11.1049185,-0.48685795 +10X_cells.TTTACTGAGCTTCGCG-L8TX_180712_01_F05,11.039944,0.6747205 +10X_cells.GTTAAGCTCGTGGTCG-L8TX_180712_01_E05,12.180711,-1.86006 +10X_cells.GATCGATGTCTAGCGC-L8TX_180712_01_F05,11.817648,-0.7059275 +10X_cells.TATCAGGTCAATACCG-L8TX_180712_01_F05,10.579256,-1.3797508 +10X_cells.CTCTACGCATACTCTT-L8TX_180712_01_H05,11.264941,-0.33929408 +10X_cells.TGAAAGAGTCAGAAGC-L8TX_180712_01_H05,11.001101,-0.3536461 +10X_cells.TTCCCAGTCGCACTCT-L8TX_180712_01_H05,11.508648,-3.7291958 +10X_cells.TTTATGCTCGTCCAGG-L8TX_180712_01_H05,12.036747,-3.0617867 +10X_cells.ACGGCCAGTTACCAGT-L8TX_180712_01_A06,10.989657,0.50363445 +10X_cells.CCGGTAGCAAGGCTCC-L8TX_180712_01_A06,9.823436,3.3781617 +10X_cells.GTTCTCGGTTGCTCCT-L8TX_180504_01_E01,10.818549,-0.13700579 +10X_cells.CACCAGGGTCGAATCT-L8TX_180221_01_A12,11.6348095,0.73842776 +10X_cells.CAGTAACTCGCCTGAG-L8TX_180221_01_A12,12.717866,-1.5256733 +10X_cells.TTGCCGTAGTGAAGAG-L8TX_180221_01_B12,11.965624,-0.43185094 +10X_cells.CAAGATCCACCGCTAG-L8TX_180221_01_C12,11.528859,2.2565722 +10X_cells.CAGATCAAGACTTGAA-L8TX_180221_01_C12,12.4553385,-1.6366388 +10X_cells.GAACCTATCCGCGTTT-L8TX_180221_01_C12,11.917795,-0.36427996 +10X_cells.ATAGACCAGGAATGGA-L8TX_180115_01_E10,13.022679,-3.4452693 +10X_cells.ACGAGGAGTTCAGCGC-L8TX_180115_01_F10,12.706592,-1.8720042 +10X_cells.GTCTTCGCATGCCTTC-L8TX_180115_01_A11,11.6073065,-1.4269224 +10X_cells.GGTATTGCACATCCGG-L8TX_180115_01_A09,11.090259,-2.400646 +10X_cells.ATAGACCGTCCGACGT-L8TX_180115_01_C09,13.175787,-2.803053 +10X_cells.CAGATCACATATACGC-L8TX_180115_01_C09,11.479115,-1.4639746 +10X_cells.GCTGCTTCAGTCAGAG-L8TX_180115_01_C09,11.33741,-2.2429976 +10X_cells.GTCAAGTTCAATCTCT-L8TX_180115_01_C09,10.995908,-3.2799804 +10X_cells.GTCTCGTGTCGTCTTC-L8TX_180115_01_C09,12.480973,-0.30083033 +10X_cells.GTCTCGTTCTCGAGTA-L8TX_180115_01_C09,12.018641,-1.1511843 +10X_cells.ATTTCTGGTTACGCGC-L8TX_180115_01_D09,12.074767,-1.9126885 +10X_cells.GACTAACTCATCGCTC-L8TX_180115_01_D09,12.0088625,-3.102695 +10X_cells.TGACAACCAATAACGA-L8TX_180115_01_D09,11.698442,-2.0795417 +10X_cells.TCAACGACACACGCTG-L8TX_180115_01_D10,13.527147,-1.1827466 +10X_cells.ACCGTAAAGGGCTTGA-L8TX_180115_01_A11,13.782813,-1.3787394 +10X_cells.CTCTACGAGGAGCGTT-L8TX_180115_01_A11,13.393033,-2.8181915 +10X_cells.TATGCCCTCAATAAGG-L8TX_180115_01_A11,11.258354,-3.6764073 +10X_cells.TTCCCAGCAGTCGATT-L8TX_180115_01_A11,10.992443,-0.09183524 +10X_cells.AACTCTTGTTGACGTT-L8TX_180115_01_H10,11.960867,-0.60107815 +10X_cells.GGCAATTTCGCAAACT-L8TX_180115_01_B10,12.290018,-0.3889575 +10X_cells.ATCTGCCCAGGGTACA-L8TX_180115_01_B11,12.9499,-2.0384164 +10X_cells.CAAGATCCATGTTGAC-L8TX_180115_01_B11,10.716788,-1.2277792 +10X_cells.CGGTTAAAGTGCCAGA-L8TX_180115_01_B11,13.150104,-1.2639552 +10X_cells.CTAGTGAGTTATCGGT-L8TX_180115_01_C10,12.843426,-1.2396753 +10X_cells.CGAGCACAGGCTCATT-L8TX_180115_01_C11,12.345865,-3.8355176 +10X_cells.TGGTTCCCACAAGACG-L8TX_180115_01_C11,10.637235,-1.5004965 +10X_cells.GGGTCTGAGAGTCTGG-L8TX_180115_01_D11,12.485757,-3.2789567 +10X_cells.TGAGCATTCACAACGT-L8TX_180115_01_D11,10.438154,-2.420112 +10X_cells.AGGTCATCACCGGAAA-L8TX_180115_01_F10,12.322997,-0.98755157 +10X_cells.ATAAGAGGTTGTGGCC-L8TX_180115_01_F10,11.791728,-1.3387064 +10X_cells.CATGGCGGTTCCCTTG-L8TX_180115_01_F10,11.944583,-1.9978089 +10X_cells.ACGGGTCCACTGTGTA-L8TX_180115_01_G10,12.361279,-1.3295861 +10X_cells.CACATAGAGTATCTCG-L8TX_180115_01_G10,12.622904,-1.7353022 +10X_cells.AAAGATGAGCCCTAAT-L8TX_180115_01_E11,12.28426,-3.165425 +10X_cells.CACCACTCAATAGAGT-L8TX_180115_01_F11,10.338471,-1.9554079 +10X_cells.CCAATCCTCGCCGTGA-L8TX_180115_01_F11,12.068774,-3.1241217 +10X_cells.CGATTGACAGGAACGT-L8TX_180115_01_F11,11.44619,-0.6415971 +10X_cells.GAACCTAAGACATAAC-L8TX_180115_01_H11,9.731628,-1.4066991 +10X_cells.CTGGTCTAGAAGCCCA-L8TX_180115_01_H09,12.434975,-0.7849177 +10X_cells.TGAGAGGAGCGATATA-L8TX_180115_01_H09,13.017368,-1.5774001 +10X_cells.TGGTTAGGTGCACTTA-L8TX_180115_01_F09,12.873063,-1.8202283 +10X_cells.TAGGCATAGCTATGCT-L8TX_171120_01_G07,11.552393,-4.264613 +10X_cells.CACAGGCTCTGAAAGA-L8TX_171120_01_H07,10.821686,-2.4668782 +10X_cells.TCTTCGGTCCCACTTG-L8TX_171120_01_H07,6.9149756,-1.5232104 +10X_cells.GAGTCCGGTTACTGAC-L8TX_180115_01_D08,12.186794,-3.3017225 +10X_cells.TGAGGGAGTGATAAGT-L8TX_171120_01_E07,11.504964,-1.4540757 +10X_cells.CTTAACTCATGGTAGG-L8TX_171120_01_F07,13.154627,-3.4531608 +10X_cells.CAGCTGGGTATAATGG-L8TX_180115_01_E08,10.708344,-2.8462605 +10X_cells.CCTACCAGTAAACGCG-L8TX_180115_01_E08,12.434612,-3.7264965 +10X_cells.CTCCTAGGTGTGGTTT-L8TX_180115_01_E08,11.309097,-3.955262 +Smartseq_cells.LS-15353_S36_E1-50,11.705618,-3.054461 +Smartseq_cells.SM-DD45I_S022_E1-50,12.165398,-3.649296 +Smartseq_cells.SM-DD45L_S181_E1-50,12.389863,-3.7174735 +Smartseq_cells.SM-GE631_S055_E1-50,11.971284,-3.4986622 +Smartseq_cells.SM-GE631_S085_E1-50,12.581366,-3.8032289 +Smartseq_cells.SM-GE631_S160_E1-50,11.44028,-3.0721483 +Smartseq_cells.SM-GE64U_S077_E1-50,11.086186,-2.348998 +Smartseq_cells.SM-GE67T_S220_E1-50,12.223545,-3.6835308 +Smartseq_cells.SM-GE8ZW_S146_E1-50,11.817573,-3.0247164 +10X_cells.ATCCACCCAGTACACT-L8TX_180221_01_A10,12.121109,-1.1862931 +10X_cells.GTTTCTACAGCTGGCT-L8TX_180712_01_B06,10.05808,-0.77052534 +10X_cells.TGGTTAGTCGGCGCAT-L8TX_180712_01_C06,10.117626,-0.8359196 +10X_cells.ACACCAACATGGATGG-L8TX_180221_01_C09,11.232503,0.7958584 +10X_cells.CGTAGGCGTACCGTTA-L8TX_180221_01_D09,11.049123,-1.1872101 +10X_cells.TGCTACCGTAGCACGA-L8TX_180712_01_B06,9.9418745,-0.053104315 +10X_cells.ACGGGTCAGCGCTCCA-L8TX_181011_01_G02,11.900327,-0.22921686 +10X_cells.CGGCTAGGTAGAGGAA-L8TX_180829_01_D10,11.381126,0.19652615 +10X_cells.GCACATAAGCAGGCTA-L8TX_180829_01_D10,10.588756,0.6507802 +10X_cells.TGCCAAATCTTCAACT-L8TX_180829_01_D10,10.933751,1.3687555 +10X_cells.CGTAGGCGTGGTCCGT-L8TX_180907_01_G10,11.059027,0.38947332 +10X_cells.GGCAATTAGATGCCAG-L8TX_180907_01_G10,11.529253,-0.72758305 +10X_cells.GGTGCGTGTTAGTGGG-L8TX_181011_01_G02,11.910814,-0.89604056 +10X_cells.GGACAGATCGGATGGA-L8TX_181011_01_C04,11.651631,1.4836682 +10X_cells.TTGGCAAAGTAGTGCG-L8TX_181011_01_C04,12.475404,-0.1543063 +10X_cells.GATGAAAAGCGTTCCG-L8TX_181012_01_G04,11.27515,0.06660178 +10X_cells.GTTCGGGAGTGTCCAT-L8TX_181012_01_H04,9.952263,-0.06254362 +10X_cells.TATGCCCTCAATCTCT-L8TX_181012_01_E05,11.180258,1.4150152 +Smartseq_cells.SM-GE5VH_S087_E1-50,9.621174,-0.9084685 +10X_cells.GACGTTACAATACGCT-L8TX_171026_01_B04,9.780146,-0.9095263 +10X_cells.GTTAAGCCACTCGACG-L8TX_171026_01_B04,9.574329,-0.15175109 +10X_cells.TCACGAATCTGCGTAA-L8TX_171026_01_B04,8.98409,0.15898141 +10X_cells.TGCTACCAGTTTAGGA-L8TX_171026_01_G04,8.839456,-0.07128554 +10X_cells.CATTATCAGGACACCA-L8TX_171026_01_B05,8.822344,0.16797628 +10X_cells.CGGTTAATCACAAACC-L8TX_171026_01_H03,10.678734,0.43958837 +10X_cells.CGATCGGGTTCGTCTC-L8TX_171026_01_E05,9.089074,-0.3124302 +10X_cells.TGACTAGGTAGCGCAA-L8TX_171026_01_E05,11.258787,0.62616944 +10X_cells.CTGATCCAGTAGATGT-L8TX_171026_01_F05,11.260841,1.107882 +10X_cells.GATCGATAGGGCACTA-L8TX_181206_01_C12,9.907862,0.23633473 +10X_cells.CACTCCATCTCCAACC-L8TX_181206_01_F12,10.991984,-0.013274794 +10X_cells.AATCGGTGTTAAGTAG-L8TX_180221_01_D10,10.596779,0.6593448 +10X_cells.TGAGAGGCATTTGCTT-L8TX_180221_01_G10,10.131367,-0.37348616 +10X_cells.TACGGGCAGATCTGCT-L8TX_190312_01_B02,11.449835,0.075075336 +10X_cells.CACCTTGGTGTAAGTA-L8TX_181012_01_C05,11.950241,-0.9122049 +10X_cells.TCAACGATCTTAACCT-L8TX_181012_01_C05,10.468787,-0.8581754 +Smartseq_cells.SM-GE8XO_S013_E1-50,9.671867,-0.9841977 +10X_cells.TTCTTAGTCTTGTCAT-L8TX_180221_01_B11,11.00734,-0.9090509 +10X_cells.ACGCCAGTCACTGGGC-L8TX_190312_01_A03,9.149833,-0.34703842 +10X_cells.CGGTTAACAATGGAGC-L8TX_180907_01_H11,12.323322,-0.5774864 +10X_cells.GAGTCCGAGTCTCCTC-L8TX_180907_01_F11,10.605145,0.4400098 +10X_cells.TAGACCACAGTTCCCT-L8TX_180907_01_F11,9.280495,0.3285866 +10X_cells.ACTTACTGTTAAGGGC-L8TX_181011_01_A03,11.90482,1.3311269 +10X_cells.TGGGAAGCACGCATCG-L8TX_181011_01_C03,11.519249,0.3309293 +10X_cells.TATCTCATCTCATTCA-L8TX_181011_01_H03,9.227627,1.873848 +10X_cells.AACCGCGCACCCATTC-L8TX_180712_01_H05,10.335392,2.2835743 +10X_cells.ACCCACTGTTATGCGT-L8TX_180712_01_H05,11.367833,0.4398238 +10X_cells.CACATTTCAGGTCCAC-L8TX_180712_01_H05,11.154797,-0.15060659 +10X_cells.CATGCCTCACAACTGT-L8TX_180712_01_H05,11.322938,-0.35231408 +10X_cells.GGATTACGTGGACGAT-L8TX_180712_01_H05,10.958039,-1.3528466 +10X_cells.CAAGGCCCACATAACC-L8TX_180712_01_A06,10.26059,-1.053947 +10X_cells.CTGTTTACATATGGTC-L8TX_180504_01_E01,11.137919,-0.15571827 +10X_cells.GGCTCGAGTATATGGA-L8TX_180504_01_E01,10.8905115,1.2301973 +10X_cells.GGGTTGCTCTGAGTGT-L8TX_180504_01_E01,10.949577,0.7353364 +10X_cells.TCTCTAAAGTGCCATT-L8TX_180221_01_A12,11.699862,2.8402166 +10X_cells.TATGCCCCACTTGGAT-L8TX_180221_01_C12,11.249506,0.86559623 +10X_cells.CGTCAGGGTTTAGGAA-L8TX_200611_02_A05,10.994703,0.18006407 +10X_cells.GCGCAGTCACAGGAGT-L8TX_200611_02_A05,10.3861475,-0.034323215 +Smartseq_cells.SM-GE91L_S114_E1-50,9.718664,-0.33228356 +10X_cells.GACTACATCCTTTCTC-L8TX_180115_01_D11,9.36745,0.9832208 +10X_cells.CTCTAATAGCGATTCT-L8TX_180115_01_F09,10.8280735,-0.8492721 +10X_cells.ACTTGTTCATTACCTT-L8TX_180115_01_E11,8.963416,0.4479301 +10X_cells.GCATACAGTAGGAGTC-L8TX_180115_01_H11,9.019783,0.064789645 +10X_cells.ACGCCAGGTACGCACC-L8TX_180115_01_B09,12.241475,0.24922182 +10X_cells.AGCTCTCTCTATCCTA-L8TX_180115_01_B09,12.008434,0.4550796 +10X_cells.CAACCTCCAGCTGTAT-L8TX_180115_01_B09,10.804317,-0.32023004 +10X_cells.TGGCTGGCACCAGGTC-L8TX_180115_01_B09,11.828195,1.0007182 +10X_cells.AACTCAGAGAGGTACC-L8TX_180115_01_H10,11.80131,1.0438914 +10X_cells.AATCCAGGTCTAGCCG-L8TX_180115_01_H10,12.056659,0.41131157 +10X_cells.CACACTCAGTTGTAGA-L8TX_180115_01_B10,11.773401,0.66804487 +10X_cells.GTCATTTTCCAGTATG-L8TX_180115_01_B11,11.047364,-0.9058281 +10X_cells.CTCGGAGCATGGTAGG-L8TX_180115_01_C10,12.509613,-0.14469643 +10X_cells.TGGTTAGGTCAGTGGA-L8TX_180115_01_E11,9.821366,-0.17002964 +10X_cells.CGCGTTTGTCAGATAA-L8TX_180115_01_F11,12.127764,1.0666212 +10X_cells.AGAGCTTGTTCGTCTC-L8TX_180115_01_G11,12.255096,-0.50501 +10X_cells.TTCTACAGTCCGTGAC-L8TX_180115_01_G11,8.891227,0.0826836 +10X_cells.CGGCTAGGTGCGCTTG-L8TX_180115_01_H11,11.242573,-0.73789644 +10X_cells.GTGCGGTAGATGCGAC-L8TX_180115_01_H11,9.9866,-0.608542 +10X_cells.CCGGTAGCAATCCAAC-L8TX_180115_01_H09,12.31655,-0.09762226 +10X_cells.TAGTTGGGTTCTCATT-L8TX_180115_01_H09,12.136936,0.049957287 +10X_cells.CAGTAACCACAGGAGT-L8TX_180115_01_E09,9.761239,0.44968277 +10X_cells.CCTACCACACACCGCA-L8TX_180115_01_E09,10.877223,0.44939587 +10X_cells.TCACGAATCAAACGGG-L8TX_180115_01_E09,11.047276,-0.52291507 +10X_cells.TCGCGTTAGGGTGTGT-L8TX_180115_01_E09,11.1013155,0.7931147 +10X_cells.ACCAGTAAGCCGGTAA-L8TX_180115_01_F09,11.31721,-0.38885587 +10X_cells.CATTCGCGTAAAGGAG-L8TX_180115_01_G09,12.270752,0.29727602 +10X_cells.TAGACCAAGCGTAATA-L8TX_180115_01_G08,10.760112,-2.614426 +10X_cells.GGGAATGGTACATGTC-L8TX_171120_01_D07,11.100491,0.37478954 +10X_cells.GACACGCCATCCGTGG-L8TX_171120_01_C07,11.3260975,0.031371433 +10X_cells.TAGTGGTCAAGGACTG-L8TX_180115_01_F08,10.270427,-1.1995872 +10X_cells.GCGCAACAGTAACCCT-L8TX_180115_01_F08,9.353728,0.3359891 +10X_cells.GTGCGGTCACAGGTTT-L8TX_180115_01_F08,9.045254,-0.32323724 +10X_cells.GAACATCCAGTGGAGT-L8TX_180115_01_C08,12.199629,0.28099492 +10X_cells.ACTTTCAGTGGGTATG-L8TX_180115_01_E08,10.000998,-0.8398574 +10X_cells.CGATCGGGTGAAGGCT-L8TX_180115_01_E08,8.454449,0.31394094 +Smartseq_cells.LS-14696_S10_E1-50,9.517622,-0.29977855 +Smartseq_cells.LS-15000_S55_E1-50,9.567558,-0.6655804 +Smartseq_cells.LS-15068_S36_E1-50,9.063095,-0.08658883 +Smartseq_cells.SM-D9CXQ_S02_E1-50,9.579505,-0.5019917 +Smartseq_cells.SM-GE631_S138_E1-50,10.709074,-1.7060176 +Smartseq_cells.SM-GE631_S149_E1-50,9.141331,-0.46643835 +Smartseq_cells.SM-GE631_S151_E1-50,9.456022,-0.9184601 +Smartseq_cells.SM-GE631_S168_E1-50,10.286325,-1.8177556 +Smartseq_cells.SM-GE631_S186_E1-50,9.198852,-0.30900803 +10X_cells.ATGAGGGCAGGATCGA-L8TX_180221_01_C10,14.06063,12.726384 +10X_cells.CGGACACCATTGGTAC-L8TX_180221_01_H09,8.545176,2.1489005 +10X_cells.GACGCGTCATAACCTG-L8TX_180221_01_G09,9.519319,5.0270004 +10X_cells.CAGCTAAAGCCAGTAG-L8TX_180221_01_A10,9.2716255,3.854324 +10X_cells.GAAGCAGTCCTCAACC-L8TX_180406_01_C06,10.462342,6.839834 +10X_cells.TTTCCTCTCATCGCTC-L8TX_180221_01_C10,8.963533,3.947462 +10X_cells.CACTCCACACATGACT-L8TX_180221_01_H09,10.157826,5.710853 +10X_cells.TTCGAAGAGCTTATCG-L8TX_180221_01_G09,10.830613,5.02627 +10X_cells.AAGACCTGTTACCGAT-L8TX_180406_01_C06,10.629758,3.05874 +10X_cells.TTAGGCACACGCTTTC-L8TX_180406_01_C06,11.002328,1.4961481 +10X_cells.GAACGGATCTACTCAT-L8TX_180221_01_B10,8.895299,1.5703434 +10X_cells.GAAACTCCACCGCTAG-L8TX_180406_01_F02,9.4456835,2.6748023 +10X_cells.CTCTACGAGTAATCCC-L8TX_180221_01_F09,10.349585,1.6013829 +10X_cells.CTGTTTATCCGCGTTT-L8TX_180221_01_F09,9.366887,6.1546764 +10X_cells.GCCAAATAGGGTTCCC-L8TX_180221_01_F09,8.578008,2.4875412 +10X_cells.CGATGTAAGAATAGGG-L8TX_180221_01_G09,8.89623,2.3654823 +10X_cells.TCAGATGTCCAATGGT-L8TX_180221_01_G09,9.444643,3.5686958 +10X_cells.TGACTAGCATCCTAGA-L8TX_180221_01_G09,11.238749,1.5764943 +10X_cells.TTGAACGAGGTGCTTT-L8TX_180221_01_G09,8.951651,1.2569044 +10X_cells.CGGGTCAGTTTAAGCC-L8TX_180221_01_H09,10.477469,4.885711 +10X_cells.TAGTTGGTCTATCCTA-L8TX_180221_01_H09,9.973201,5.570507 +10X_cells.TCGCGAGTCCTACAGA-L8TX_180221_01_H09,9.817261,0.75418544 +10X_cells.ACGCAGCTCCTTTACA-L8TX_180221_01_A10,8.719086,2.2576027 +10X_cells.ATTGGACGTTGTGGCC-L8TX_180221_01_A10,10.925104,5.559693 +10X_cells.CACAAACTCCACGACG-L8TX_180221_01_A10,9.227041,0.5860382 +10X_cells.GTTACAGTCTTGGGTA-L8TX_180221_01_A10,8.298395,3.1473312 +10X_cells.ACTGAACGTGCACGAA-L8TX_180221_01_B10,8.598673,2.3647814 +10X_cells.CAACCTCGTTCCACAA-L8TX_180221_01_B10,10.851197,4.40937 +10X_cells.GAACGGAAGTATCTCG-L8TX_180221_01_C10,10.353433,3.8018975 +10X_cells.GCTGCTTAGGATGTAT-L8TX_180221_01_C10,9.185607,1.2432754 +10X_cells.GTGCAGCCAATTGCTG-L8TX_180221_01_C10,8.689371,2.0758102 +10X_cells.CGTGTCTCAAGCGTAG-L8TX_180406_01_F02,10.1635065,5.5485516 +10X_cells.GAAACTCCAGCCAGAA-L8TX_180406_01_F02,8.927183,2.2471888 +10X_cells.GTTTCTACACAACTGT-L8TX_180406_01_F02,9.340043,2.427243 +10X_cells.TACTTGTGTGCCTTGG-L8TX_180406_01_F02,8.343412,4.518431 +10X_cells.TTAACTCAGATAGTCA-L8TX_180406_01_F02,7.988795,4.0110683 +10X_cells.AAAGATGAGATAGGAG-L8TX_180406_01_C06,10.627782,4.841801 +10X_cells.AGAGCGAGTCTCTTTA-L8TX_180406_01_C06,11.40175,2.9578376 +10X_cells.ATTACTCCAAAGTCAA-L8TX_180406_01_C06,10.940113,7.795953 +Smartseq_cells.SM-GE63W_S026_E1-50,9.537889,3.4825401 +Smartseq_cells.SM-GE63N_S351_E1-50,9.117767,3.2876143 +Smartseq_cells.SM-GE64P_S008_E1-50,7.7717595,2.8945093 +10X_cells.TGCCCTACATCAGTAC-L8TX_180221_01_C09,14.052837,12.149181 +10X_cells.TGTCCCAAGACTCGGA-L8TX_180712_01_G05,9.442181,4.959123 +10X_cells.CTTACCGGTAGCTAAA-L8TX_180712_01_C06,8.335088,4.7029843 +10X_cells.CTAGCCTTCGCACTCT-L8TX_180221_01_C09,7.920812,4.625541 +10X_cells.CGGAGCTAGGCGACAT-L8TX_180712_01_B06,8.155477,3.5125744 +10X_cells.CGTAGGCAGTCTCAAC-L8TX_180712_01_B06,4.8848395,0.7334084 +10X_cells.TTGGAACCATGCCACG-L8TX_180712_01_B06,10.070113,6.550346 +10X_cells.CATTCGCTCCATGAGT-L8TX_180712_01_B06,10.529155,2.2955823 +10X_cells.TACACGAGTTCGTGAT-L8TX_180221_01_E09,9.416901,2.6050565 +10X_cells.GTCACAATCTATCCTA-L8TX_180221_01_C09,10.167351,6.404958 +10X_cells.CACAGGCAGTAGGTGC-L8TX_180221_01_C09,10.056544,5.970989 +10X_cells.GTTACAGTCCTCGCAT-L8TX_180607_01_C05,9.192739,5.193262 +10X_cells.GACAGAGCATACTACG-L8TX_180221_01_H12,9.0543165,4.007967 +10X_cells.ATCTGCCGTCAGAATA-L8TX_180221_01_D09,10.692444,7.039951 +10X_cells.GCATGCGGTGTTAAGA-L8TX_180607_01_C05,10.323971,2.0053213 +10X_cells.ACACCGGCAGATCTGT-L8TX_180221_01_C09,11.14352,1.029462 +10X_cells.AACTTTCCATGTCGAT-L8TX_180221_01_H12,10.50012,7.2669754 +10X_cells.GTCACGGGTTTACTCT-L8TX_180221_01_D09,10.3614435,0.45727426 +10X_cells.TACAGTGTCCACGTGG-L8TX_180712_01_C06,9.469217,3.143876 +10X_cells.TTTATGCTCAGCTTAG-L8TX_180712_01_G05,9.428611,4.2187667 +10X_cells.TTTGCGCCAGCCTTTC-L8TX_180221_01_D09,10.859993,5.956846 +10X_cells.TCAGGTAGTCCATCCT-L8TX_180221_01_D09,10.073683,5.099805 +10X_cells.GAAACTCCAGCTGTTA-L8TX_180221_01_H12,9.684289,2.0315602 +10X_cells.CTGCCTACAGCCTTTC-L8TX_180221_01_C09,14.07837,12.8238735 +10X_cells.GGTGTTAGTGAACCTT-L8TX_180607_01_C05,10.119287,2.6127334 +10X_cells.GGTGTTAAGAGAACAG-L8TX_180712_01_G05,8.781393,2.0810037 +10X_cells.GAACCTAAGGAGCGAG-L8TX_180221_01_E09,7.517568,1.5032036 +10X_cells.ACTGCTCGTTGAGGTG-L8TX_180221_01_D09,10.456356,6.107635 +10X_cells.GTTCATTTCACAGGCC-L8TX_180712_01_B06,10.571688,7.54383 +10X_cells.CTGAAACTCCGCGGTA-L8TX_180221_01_C09,8.21074,2.83632 +10X_cells.AACCGCGAGAGGGCTT-L8TX_180712_01_G05,10.568549,3.5049853 +10X_cells.CTCGAGGCAGCATGAG-L8TX_180221_01_D09,7.468631,4.4311447 +10X_cells.TTTGCGCTCATGTGGT-L8TX_180221_01_D09,14.331338,12.919723 +10X_cells.GTCTCGTAGTACCGGA-L8TX_180607_01_C05,8.122835,3.125312 +10X_cells.TGGCTGGCACATCTTT-L8TX_180712_01_B06,9.619612,5.3511744 +10X_cells.CGCGGTACAGAGCCAA-L8TX_180221_01_E09,6.9122915,3.573241 +10X_cells.TCCACACAGACAAGCC-L8TX_180221_01_E09,8.77757,1.369216 +10X_cells.ATTGGACCAAGCTGGA-L8TX_180221_01_H12,9.7171,2.5210197 +10X_cells.TGACTTTCAAGGGTCA-L8TX_180607_01_C05,8.140796,4.2980595 +10X_cells.AACTTTCAGGAACTGC-L8TX_180712_01_G05,9.425762,4.983075 +10X_cells.AGCATACGTTCCACTC-L8TX_180607_01_C05,9.453349,5.5798936 +10X_cells.ACTGTCCTCACTTATC-L8TX_180712_01_B06,8.732623,3.2439885 +10X_cells.TTCGGTCAGAGGGATA-L8TX_180221_01_E09,9.540635,4.6518464 +10X_cells.GCTGCGAAGTCGTTTG-L8TX_180221_01_H12,9.124259,3.6719785 +10X_cells.ATTATCCAGTCGATAA-L8TX_180712_01_B06,8.869115,1.9238775 +10X_cells.AGAGCGAAGGAATTAC-L8TX_180712_01_B06,10.435929,4.968544 +10X_cells.GTTCTCGGTACAGTGG-L8TX_180712_01_B06,9.808509,4.740247 +10X_cells.CTGAAACGTTTGGGCC-L8TX_180712_01_B06,9.067245,4.3422985 +10X_cells.GTGCATAGTTACGTCA-L8TX_180607_01_C05,7.648231,4.9614725 +10X_cells.GACTACAAGCTGGAAC-L8TX_180712_01_B06,10.4730625,5.994356 +10X_cells.GACACGCGTCTGCCAG-L8TX_180221_01_E09,10.091782,3.340713 +10X_cells.AGCGTATTCTTGCATT-L8TX_180221_01_D09,10.69356,4.1101336 +10X_cells.CAAGGCCAGCCTATGT-L8TX_180221_01_E09,9.841366,4.5748525 +10X_cells.CCTTACGTCTTAGCCC-L8TX_180712_01_B06,11.069775,6.321153 +10X_cells.AAGCCGCAGTACTTGC-L8TX_180221_01_D09,10.783839,6.003661 +Smartseq_cells.SM-GE679_S204_E1-50,9.201053,2.5349007 +Smartseq_cells.SM-GE679_S316_E1-50,9.843913,5.1875577 +Smartseq_cells.LS-15012_S06_E1-50,9.250567,4.286801 +Smartseq_cells.LS-15012_S24_E1-50,8.866787,1.533596 +Smartseq_cells.LS-15012_S36_E1-50,8.907122,0.7782009 +Smartseq_cells.LS-15012_S44_E1-50,9.287431,3.6204076 +Smartseq_cells.LS-15019_S01_E1-50,9.298403,4.0619135 +Smartseq_cells.LS-15019_S53_E1-50,9.670256,4.8199706 +Smartseq_cells.LS-15023_S26_E1-50,9.090033,1.7900392 +Smartseq_cells.LS-15023_S34_E1-50,9.562552,4.555036 +Smartseq_cells.LS-15306_S88_E1-50,9.771512,4.807728 +Smartseq_cells.LS-15312_S17_E2-50,8.959907,1.339446 +Smartseq_cells.LS-15325_S10_E2-50,8.45909,3.3959775 +Smartseq_cells.LS-15325_S24_E2-50,13.922586,11.251583 +Smartseq_cells.LS-15337_S04_E1-50,7.6382837,3.2915578 +Smartseq_cells.LS-15340_S80_E1-50,8.672482,0.8544259 +Smartseq_cells.LS-15341_S42_E1-50,7.923859,3.5061371 +Smartseq_cells.LS-15345_S17_E1-50,9.17788,1.8029015 +Smartseq_cells.SQ-80004_S60_E1-50,9.014459,1.8354763 +Smartseq_cells.SQ-80004_S63_E1-50,9.419168,3.751911 +Smartseq_cells.SM-D9E5X_S73_E1-50,9.006839,4.0820427 +Smartseq_cells.SM-GE635_S176_E1-50,8.841768,1.2862905 +Smartseq_cells.SM-GE659_S087_E1-50,8.218854,1.1251479 +10X_cells.GCGCCAAGTCAACATC-L8TX_181012_01_H04,7.1423445,0.96182686 +10X_cells.TGGACGCCAGCGTCCA-L8TX_180829_01_E10,11.351561,1.5940721 +10X_cells.TTAGGCAGTTTGCATG-L8TX_181012_01_G04,10.144595,2.0117054 +10X_cells.AGCCTAATCTGCGTAA-L8TX_180829_01_D09,10.02505,5.2185884 +10X_cells.CTCTAATGTTTGTGTG-L8TX_180829_01_D09,10.239685,4.5090685 +10X_cells.GTCGGGTCAAAGGAAG-L8TX_180829_01_D09,10.445085,4.7379637 +10X_cells.TGCTACCGTTTGCATG-L8TX_180829_01_D09,8.551034,5.6036177 +10X_cells.CATATGGAGATGAGAG-L8TX_180829_01_D10,10.502663,5.296034 +10X_cells.CCTAGCTAGCATCATC-L8TX_180829_01_D10,9.927876,6.3681536 +10X_cells.TGTCCCAAGAGCTGCA-L8TX_180829_01_D10,9.227499,4.1773887 +10X_cells.CATCCACAGTTAGGTA-L8TX_180829_01_E10,11.632422,5.529479 +10X_cells.CATTCGCGTATCAGTC-L8TX_180829_01_E10,9.600838,1.6285855 +10X_cells.CCGTGGATCCTAGGGC-L8TX_180829_01_E10,11.407947,1.7401245 +10X_cells.GATCAGTGTGAAATCA-L8TX_180829_01_E10,9.346978,0.6791776 +10X_cells.GCCTCTATCTAACGGT-L8TX_180829_01_E10,10.891693,4.371776 +10X_cells.GGGTTGCGTAGCTGCC-L8TX_180829_01_E10,9.864466,6.2045054 +10X_cells.TACTTGTGTCGCGTGT-L8TX_180829_01_E10,10.984298,4.599735 +10X_cells.TGGCGCATCGCCAGCA-L8TX_180829_01_E10,9.557142,0.29229546 +10X_cells.ACGTCAATCACTTCAT-L8TX_180907_01_F10,10.490494,3.3606877 +10X_cells.TTCTTAGAGAGTCGGT-L8TX_180907_01_F10,9.386789,2.8745487 +10X_cells.AGAGTGGAGGGTTTCT-L8TX_180907_01_G10,10.634822,4.6170435 +10X_cells.GTTACAGGTTGACGTT-L8TX_180907_01_G10,9.046514,4.296156 +10X_cells.CGGACGTAGCTAGCCC-L8TX_181011_01_G02,9.07862,2.7859373 +10X_cells.GGCAATTAGCTCCCAG-L8TX_181011_01_G02,9.857353,0.66545904 +10X_cells.GGCCGATGTTATCCGA-L8TX_181011_01_G02,9.579133,2.327231 +10X_cells.CATCCACCATGCTGGC-L8TX_181011_01_C04,10.704439,4.5940447 +10X_cells.GCCAAATTCATAGCAC-L8TX_181011_01_C04,10.034901,2.7219715 +10X_cells.AGAATAGTCTTTACAC-L8TX_181012_01_G04,10.300005,3.074822 +10X_cells.AGCGTCGGTAAGAGGA-L8TX_181012_01_H04,10.949513,6.148904 +10X_cells.CACATAGTCTCTTGAT-L8TX_181012_01_E05,10.83176,5.9261627 +10X_cells.TACCTATCATTCTTAC-L8TX_181012_01_E05,10.3284025,5.6090584 +10X_cells.TGCGCAGTCTTGACGA-L8TX_180406_01_B06,10.699016,9.314542 +10X_cells.TCTATTGCAATGGAAT-L8TX_180406_01_E07,11.03333,7.6153846 +10X_cells.GCGAGAATCAAGGTAA-L8TX_180406_01_C07,10.034062,4.6692805 +10X_cells.CAGCCGATCTTCAACT-L8TX_180406_01_C08,10.295162,7.305191 +10X_cells.ATTGGTGCATATGCTG-L8TX_180406_01_C08,11.080394,7.367629 +10X_cells.TACGGGCTCACAGTAC-L8TX_180406_01_B06,10.22827,7.176121 +10X_cells.GCATGTAAGTTGTCGT-L8TX_180406_01_H01,10.96485,8.179303 +10X_cells.CTACGTCTCAGTCAGT-L8TX_180406_01_C07,9.713752,3.1275876 +10X_cells.CAGAGAGGTCCTCTTG-L8TX_180406_01_H01,10.568303,7.921257 +10X_cells.TTCTCCTGTACCTACA-L8TX_180406_01_E02,10.523753,7.0605755 +10X_cells.ATCCACCCACCAGCAC-L8TX_180406_01_E06,10.582838,7.9707766 +10X_cells.ACACCCTTCCTGTACC-L8TX_180406_01_E02,10.650809,8.050016 +10X_cells.AACCATGCACCGTTGG-L8TX_180406_01_C08,10.646739,7.6328144 +10X_cells.TACGGATCAGTTCCCT-L8TX_180406_01_C07,9.1167755,1.8370177 +10X_cells.CGCTGGAAGGCGTACA-L8TX_180406_01_H02,9.735303,3.6175027 +10X_cells.CTCATTATCTTAGAGC-L8TX_180406_01_C07,10.275328,5.186841 +10X_cells.GGGTCTGAGGATGGAA-L8TX_180406_01_H02,9.28077,3.0346859 +10X_cells.TAGCCGGGTTACCAGT-L8TX_180406_01_H02,9.971781,5.714331 +10X_cells.TGCCCATCAGGTCTCG-L8TX_180406_01_H02,10.043543,6.1094184 +10X_cells.TGCCCTACAGGGATTG-L8TX_180406_01_B06,10.716014,8.793316 +Smartseq_cells.SM-GE5VB_S191_E1-50,8.103135,1.2764698 +Smartseq_cells.SM-GE5VB_S283_E1-50,9.503669,3.8511117 +10X_cells.GGCCGATTCCCTTGCA-L8TX_171026_01_G03,8.649441,2.0454373 +10X_cells.GTCACAAAGGTCATCT-L8TX_171026_01_F04,8.298462,0.8730102 +10X_cells.AGGTCATAGTCGTACT-L8TX_171026_01_A04,6.718053,3.42389 +10X_cells.TTGAACGCATATGGTC-L8TX_171026_01_F03,7.899209,3.9708421 +10X_cells.AAACCTGTCATTCACT-L8TX_171026_01_E05,8.801757,4.394237 +10X_cells.GGGCATCTCCGAGCCA-L8TX_171026_01_G04,8.374188,0.24119936 +10X_cells.TGAAAGACACCGAATT-L8TX_171026_01_H03,9.645849,0.022897668 +10X_cells.AGGCCGTAGGTGATTA-L8TX_171026_01_F05,13.955196,11.373319 +10X_cells.AGGCCGTGTTCTCATT-L8TX_171026_01_B04,9.772746,0.33361712 +10X_cells.AGGTCATAGCTAGCCC-L8TX_171026_01_C05,10.708568,5.620349 +10X_cells.ACGAGGACACATCCGG-L8TX_171026_01_C05,9.744157,3.8607388 +10X_cells.TATCAGGGTCAGATAA-L8TX_171026_01_D05,9.971857,2.3619988 +10X_cells.CATCGGGTCGAATGGG-L8TX_171026_01_F04,9.68091,5.7519755 +10X_cells.ACTTGTTAGACACTAA-L8TX_171026_01_B04,9.756683,5.1553144 +10X_cells.TACTTGTTCCTACAGA-L8TX_171026_01_E05,9.714702,4.5195107 +10X_cells.ATCGAGTCAGCCACCA-L8TX_171026_01_E05,10.150484,2.7689006 +10X_cells.TGAGAGGAGCGTGAGT-L8TX_171026_01_H04,8.762728,3.5847666 +10X_cells.GTATTCTGTCACACGC-L8TX_171026_01_A05,9.51887,2.33698 +10X_cells.ATTCTACGTGAACCTT-L8TX_171026_01_F03,8.939922,3.1688316 +10X_cells.CGTAGCGCAGGCGATA-L8TX_171026_01_G04,8.396634,2.4175253 +10X_cells.CTCTAATCAGTCCTTC-L8TX_171026_01_G03,8.771372,1.8968674 +10X_cells.GTTAAGCGTCTGCCAG-L8TX_171026_01_B05,9.692797,4.344626 +10X_cells.GGACATTCAATCACAC-L8TX_171026_01_B04,9.987045,4.8199415 +10X_cells.TTGTAGGAGACACTAA-L8TX_171026_01_B04,8.434124,4.076847 +10X_cells.AGGTCCGTCATGCAAC-L8TX_171026_01_G03,8.600089,1.2514126 +10X_cells.AACTCAGCATCAGTAC-L8TX_171026_01_H03,10.346284,3.640403 +10X_cells.TTCCCAGGTTTAAGCC-L8TX_171026_01_F05,11.203089,1.3576301 +10X_cells.AGTGAGGTCAGTACGT-L8TX_171026_01_H04,9.923204,5.468926 +10X_cells.GATTCAGAGACATAAC-L8TX_171026_01_F03,9.106274,3.2582881 +10X_cells.ATCCACCCAGACAAGC-L8TX_171026_01_G04,8.621177,0.8229897 +10X_cells.GACGTGCCATTACCTT-L8TX_171026_01_B04,9.964239,2.9419205 +10X_cells.TACTCGCTCCGCAGTG-L8TX_171026_01_F03,10.570655,3.625095 +10X_cells.CTGGTCTGTTTAGCTG-L8TX_171026_01_G04,8.9575205,1.2552087 +10X_cells.GCGACCAAGAGGGATA-L8TX_171026_01_B05,7.0793686,3.611636 +10X_cells.TCTCATAGTCAGAGGT-L8TX_171026_01_A05,8.621868,4.3538017 +10X_cells.CATTATCTCAGCACAT-L8TX_171026_01_F04,10.161747,4.7068615 +10X_cells.CCTTACGCAAGTTCTG-L8TX_171026_01_E05,9.591573,4.108018 +10X_cells.CTGAAACGTCAGGACA-L8TX_171026_01_H03,9.996063,0.7308894 +10X_cells.CTAAGACGTGGGTATG-L8TX_171026_01_G04,8.372006,2.7520576 +10X_cells.ACGGGTCCATTCTTAC-L8TX_171026_01_D05,9.233807,1.927887 +10X_cells.CGATGGCCAGCTGCAC-L8TX_171026_01_D05,10.283808,2.504217 +10X_cells.GACGTTAAGAGGACGG-L8TX_171026_01_H04,5.8292003,3.8311896 +10X_cells.GACGCGTAGATACACA-L8TX_171026_01_G03,9.695832,1.8304672 +10X_cells.ATCGAGTAGGTGACCA-L8TX_171026_01_F04,9.437192,0.7061866 +10X_cells.ACAGCTATCTCACATT-L8TX_171026_01_G04,8.140121,5.309431 +10X_cells.CTAAGACAGAATTGTG-L8TX_171026_01_F03,9.956515,0.29023817 +10X_cells.TGTCCCATCCTGCCAT-L8TX_171026_01_B04,8.372602,2.139972 +10X_cells.CTCGTCACAGTCAGAG-L8TX_171026_01_F05,10.650042,2.4699051 +10X_cells.TTAGGACGTTAGAACA-L8TX_171026_01_C05,9.693014,5.214237 +10X_cells.TATTACCTCTGGCGAC-L8TX_171026_01_F03,10.082112,3.6055923 +10X_cells.CTCGGGATCGAACGGA-L8TX_171026_01_G03,7.581845,0.9088088 +10X_cells.GAATAAGCACGACTCG-L8TX_171026_01_B04,9.867011,0.7493224 +10X_cells.GATCGCGTCATACGGT-L8TX_181206_01_H11,9.8641,2.1809633 +10X_cells.TGCGCAGCAGATCTGT-L8TX_181206_01_H11,8.5446205,2.3511589 +10X_cells.ACGCAGCGTAAGGGCT-L8TX_181206_01_A12,8.813485,1.2576844 +10X_cells.GCTCTGTTCACTTATC-L8TX_181206_01_A12,10.765371,3.4509559 +10X_cells.GGGTCTGAGCACACAG-L8TX_181206_01_A12,8.067474,1.394266 +10X_cells.TGTATTCAGGCTCTTA-L8TX_181206_01_B12,11.364344,3.0222843 +10X_cells.CGTTCTGAGTACGCGA-L8TX_181206_01_C12,10.645353,3.2488682 +10X_cells.GACTAACGTACTCAAC-L8TX_181206_01_D12,9.693292,2.7560792 +10X_cells.TCGTACCCAGCCACCA-L8TX_181206_01_D12,10.563229,1.2355305 +10X_cells.GCTGCTTAGGATCGCA-L8TX_181206_01_F12,10.826836,3.6004288 +10X_cells.TGAGCCGCAGCTGGCT-L8TX_181206_01_F12,11.675613,5.3127694 +10X_cells.ATTGGTGCATCTATGG-L8TX_181206_01_E12,9.368907,5.1375427 +10X_cells.CACACCTAGGACATTA-L8TX_181206_01_E12,9.361919,4.7431183 +10X_cells.GTCCTCAGTGCACGAA-L8TX_181206_01_E12,8.948429,2.9869664 +10X_cells.TCACAAGCATGTTGAC-L8TX_181206_01_E12,9.262023,3.9589603 +Smartseq_cells.SM-GE91J_S017_E1-50,11.274949,11.841717 +Smartseq_cells.SM-GE91J_S127_E1-50,11.255746,11.50134 +Smartseq_cells.SM-GE91J_S243_E1-50,11.272098,11.910767 +Smartseq_cells.SM-GE914_S258_E1-50,11.272023,11.856924 +10X_cells.CCGTGGATCTGGCGTG-L8TX_180406_01_B02,10.446273,6.09923 +Smartseq_cells.SM-GE671_S273_E1-50,8.856624,3.8173623 +10X_cells.GCACTCTGTGACGCCT-L8TX_190312_01_B02,7.6483817,0.92007166 +10X_cells.GGAAAGCCAGCTGCTG-L8TX_180221_01_D10,8.5053215,0.91124 +10X_cells.GTATCTTCAAAGCAAT-L8TX_180221_01_G10,9.147565,4.0548043 +10X_cells.GTGTGCGCACAGACAG-L8TX_180221_01_F10,9.905182,4.564169 +10X_cells.GTTCGGGAGGGTGTTG-L8TX_180221_01_E10,9.514692,6.7280326 +10X_cells.GACCTGGGTCCGAATT-L8TX_180221_01_F10,10.256184,6.6247253 +10X_cells.TAGTTGGAGGAATTAC-L8TX_190312_01_B02,10.724668,4.3388786 +10X_cells.GCGCAGTCACGAAGCA-L8TX_190312_01_D02,8.522851,1.8817253 +10X_cells.AGTGGGAGTTTAAGCC-L8TX_180221_01_E10,8.945129,1.1894515 +10X_cells.ATAAGAGTCTCCAGGG-L8TX_180221_01_E10,11.015321,3.2014954 +10X_cells.GGACATTAGTCACGCC-L8TX_180221_01_E10,8.884525,5.276865 +10X_cells.GGGCACTCAAGGTTTC-L8TX_180221_01_E10,7.980698,3.4999 +10X_cells.TGTGGTACATTGCGGC-L8TX_180221_01_E10,9.69578,3.564391 +10X_cells.ACGTCAAGTCCTGCTT-L8TX_180221_01_F10,8.547219,2.6437368 +10X_cells.GTACTCCCAATGTTGC-L8TX_180221_01_F10,10.887662,0.98257357 +10X_cells.TAAGCGTAGGACAGAA-L8TX_180221_01_F10,8.444143,0.31371447 +10X_cells.GTCACAATCTACTTAC-L8TX_180221_01_G10,10.388261,6.728184 +10X_cells.AGATTGCGTACTCAAC-L8TX_180221_01_H10,7.3064876,4.5592046 +10X_cells.GGGATGACATCATCCC-L8TX_180221_01_H10,8.658249,0.573301 +10X_cells.TGATTTCGTGCATCTA-L8TX_180221_01_H10,8.799347,1.0322969 +10X_cells.ACCTTTAAGGACAGAA-L8TX_180221_01_A11,10.155748,1.7885854 +10X_cells.ACATCAGCAAACTGCT-L8TX_190312_01_B02,8.6429205,1.4601151 +10X_cells.CATATTCAGTATTGGA-L8TX_190312_01_B02,9.912069,4.6297436 +10X_cells.GCTGCGACAATGAAAC-L8TX_190312_01_B02,8.888084,4.1186996 +10X_cells.GTCATTTGTGTTTGTG-L8TX_190312_01_B02,8.945444,0.76197875 +10X_cells.TCAGCAAGTTGGTTTG-L8TX_190312_01_B02,9.010578,2.781626 +10X_cells.GGAACTTCACCTTGTC-L8TX_190312_01_C02,9.099947,3.8162782 +10X_cells.TTAACTCAGGTGGGTT-L8TX_190312_01_C02,9.10824,2.8389575 +10X_cells.TTCTACACACGCCAGT-L8TX_190312_01_C02,9.700037,3.1234968 +10X_cells.ATCCACCAGTGGCACA-L8TX_190312_01_D02,9.296782,2.739812 +10X_cells.CATTCGCAGGCTCATT-L8TX_190312_01_D02,10.009704,4.529879 +10X_cells.GTTCATTGTTTGACAC-L8TX_190312_01_D02,10.420321,7.221578 +10X_cells.TGCTACCGTGCATCTA-L8TX_190312_01_D02,9.645338,2.941351 +10X_cells.TACAGTGCAACTGGCC-L8TX_190312_01_G02,9.474324,2.5526264 +10X_cells.ATGTGTGGTTATCACG-L8TX_181012_01_C05,8.057938,6.82328 +10X_cells.TGCTGCTCACTACAGT-L8TX_180907_01_B11,9.451024,4.098913 +10X_cells.CCAGCGACAGTCACTA-L8TX_180926_01_C12,7.1990943,4.6310205 +10X_cells.TCTCTAAGTGCACGAA-L8TX_180926_01_C12,8.621802,2.0497148 +10X_cells.AAAGTAGGTTACCGAT-L8TX_180926_01_E12,11.653471,5.469276 +10X_cells.CCACTACTCACAGGCC-L8TX_181012_01_B05,10.497362,5.268673 +10X_cells.GTCTTCGCAACTGCTA-L8TX_181012_01_B05,9.935475,3.3616781 +10X_cells.TCTTCGGCAATCCAAC-L8TX_181012_01_B05,8.997092,6.114045 +10X_cells.TGCACCTGTAAGAGAG-L8TX_181012_01_B05,10.515607,6.3093734 +10X_cells.GAACATCTCTTGTACT-L8TX_181012_01_C05,10.102715,3.7069232 +10X_cells.TCAGATGCACGGCCAT-L8TX_181012_01_C05,9.389781,1.2914917 +Smartseq_cells.SM-GE8XN_S205_E1-50,8.119717,0.95836633 +10X_cells.GGGATGACATGCCTTC-L8TX_180221_01_C11,11.489866,2.060379 +10X_cells.AGCATACTCGCATGGC-L8TX_180221_01_C11,10.824766,3.3513923 +10X_cells.GTGCAGCAGATATGGT-L8TX_180221_01_E11,11.308012,3.1018562 +10X_cells.AAACCTGTCTAACGGT-L8TX_180221_01_B11,11.047189,2.8332577 +10X_cells.ACGAGCCTCCCTGACT-L8TX_180221_01_B11,11.363178,3.5148852 +10X_cells.AGACGTTTCTTTAGTC-L8TX_180221_01_B11,11.113823,2.9003515 +10X_cells.ATCACGAGTGAGCGAT-L8TX_180221_01_B11,11.621412,3.6457062 +10X_cells.CCAATCCTCATGTAGC-L8TX_180221_01_B11,11.367418,3.5056274 +10X_cells.CTCCTAGCAATCGGTT-L8TX_180221_01_B11,11.630097,3.8744729 +10X_cells.GTAGGCCAGATCTGCT-L8TX_180221_01_B11,10.799958,2.0289025 +10X_cells.TATTACCCAGGGCATA-L8TX_180221_01_B11,10.167191,1.9694562 +10X_cells.TATTACCTCTTACCTA-L8TX_180221_01_B11,10.68299,2.4217947 +10X_cells.CTTACCGTCTTGTCAT-L8TX_180221_01_C11,10.671921,3.249069 +10X_cells.TACTTGTAGATCTGCT-L8TX_180221_01_C11,10.573581,2.129808 +10X_cells.GTAACGTTCGCGTAGC-L8TX_180221_01_D11,9.248019,4.782162 +10X_cells.GTCGGGTGTTCACGGC-L8TX_180221_01_D11,11.284578,2.9234507 +10X_cells.ACGCCAGTCCCTCTTT-L8TX_180221_01_E11,10.952055,4.0251074 +10X_cells.CCTTACGGTAAATGTG-L8TX_180221_01_F11,10.858095,3.672495 +10X_cells.TTTCCTCAGTGCGATG-L8TX_180221_01_F11,10.437507,1.465726 +10X_cells.ACACCCTGTCTCAACA-L8TX_180221_01_G11,9.971367,3.91513 +10X_cells.CGTTAGAAGTCGCCGT-L8TX_180221_01_G11,10.558467,3.4198723 +10X_cells.GCGCGATGTACGCACC-L8TX_180221_01_G11,8.037121,4.509904 +10X_cells.GTCGGGTAGGAGTTTA-L8TX_180221_01_G11,10.518481,3.0396943 +10X_cells.AGGGATGGTTCAGTAC-L8TX_190312_01_F02,11.093707,3.3205118 +10X_cells.ACAGCCGCAATTGCTG-L8TX_190312_01_H02,8.874875,3.6191566 +10X_cells.CCGGTAGCAGACACTT-L8TX_190312_01_H02,10.208963,4.116117 +Smartseq_cells.SM-GE67O_S348_E1-50,8.618042,1.3553847 +Smartseq_cells.SM-GE67P_S148_E1-50,9.041522,3.7722514 +Smartseq_cells.SM-GE67P_S263_E1-50,8.652552,1.8757029 +10X_cells.AGAATAGTCAGCGACC-L8TX_180907_01_G11,10.055717,3.358215 +10X_cells.CTGAAACTCCCTTGCA-L8TX_180907_01_G11,8.558494,3.2873075 +10X_cells.CATGCCTTCGCAAGCC-L8TX_180907_01_H11,8.77433,2.1908112 +10X_cells.ACTGAACTCTATCCCG-L8TX_180907_01_A12,10.953721,6.45608 +10X_cells.TGGGCGTTCGGCTTGG-L8TX_180907_01_E11,10.284777,2.9238408 +10X_cells.GGGTCTGTCACTATTC-L8TX_190312_01_A02,8.017322,1.9385123 +Smartseq_cells.SM-DD44B_S51_E1-50,9.1066675,3.5181363 +Smartseq_cells.SM-GE5UT_S245_E1-50,9.139182,2.544444 +10X_cells.ACACCGGTCTGCAAGT-L8TX_180926_01_E01,13.838579,10.569993 +10X_cells.GTAACTGCATATGCTG-L8TX_180926_01_E01,11.636098,5.2359543 +10X_cells.AGTCTTTGTTTGTGTG-L8TX_181011_01_B03,7.8676715,2.110875 +10X_cells.CGTTAGATCCTATTCA-L8TX_180926_01_E01,10.87233,5.6494503 +10X_cells.GTGCGGTGTGTCCTCT-L8TX_181011_01_A03,8.162011,1.0833552 +10X_cells.TGCGGGTGTGCCTGTG-L8TX_180926_01_D01,9.934241,4.395173 +10X_cells.GACGCGTAGTTTCCTT-L8TX_181011_01_C03,10.264249,6.04887 +10X_cells.ACATACGAGGAGCGAG-L8TX_180926_01_B01,10.924114,3.3752804 +10X_cells.ACCAGTAGTACGCTGC-L8TX_180926_01_B01,8.399554,3.003401 +10X_cells.AGAGCTTAGGAGTACC-L8TX_180926_01_B01,8.8289385,5.180173 +10X_cells.ATCCACCAGAAACCTA-L8TX_180926_01_B01,9.339845,3.412213 +10X_cells.GATCTAGCAGATCCAT-L8TX_180926_01_D01,10.581323,2.7017329 +10X_cells.GTCAAGTTCCCTCAGT-L8TX_180926_01_D01,8.771882,5.1853943 +10X_cells.CGCTATCCAAATCCGT-L8TX_180926_01_E01,10.05816,3.4575462 +10X_cells.CTTACCGTCAGGTAAA-L8TX_180926_01_E01,11.075315,3.562038 +10X_cells.GGATTACCAAGGACTG-L8TX_180926_01_E01,11.038157,6.0917068 +10X_cells.TGCCCATGTTTCCACC-L8TX_180926_01_E01,11.078797,4.098309 +10X_cells.CACAGGCAGTGCTGCC-L8TX_180926_01_F01,10.475827,5.5714154 +10X_cells.TGTATTCCATGCAACT-L8TX_180926_01_F01,10.355428,5.718075 +10X_cells.ATCATGGGTACAGCAG-L8TX_181011_01_A03,7.429348,4.765792 +10X_cells.TCGAGGCGTTGCGCAC-L8TX_181011_01_A03,9.742359,5.1792483 +10X_cells.CACAAACTCGCATGAT-L8TX_181011_01_B03,9.44892,4.7702813 +10X_cells.AAGCCGCAGAGAGCTC-L8TX_181011_01_C03,11.048304,3.868741 +10X_cells.CACCTTGAGGTCATCT-L8TX_181011_01_C03,9.675428,4.3633056 +10X_cells.GTATCTTCAAGTCTGT-L8TX_181011_01_C03,10.379948,2.3523684 +10X_cells.GGATGTTTCCTGCTTG-L8TX_180221_01_A12,11.677969,3.8439567 +10X_cells.CATATGGCATCTATGG-L8TX_180504_01_E01,10.279584,6.702024 +10X_cells.GCGCAACAGGTGACCA-L8TX_180221_01_B12,9.583734,4.9224377 +10X_cells.TCGGTAAGTATCGCAT-L8TX_180221_01_B12,11.064564,3.8787727 +10X_cells.CAACTAGGTACCCAAT-L8TX_200611_02_A05,8.813477,3.4488268 +10X_cells.CTTAGGAGTGTTAAGA-L8TX_180221_01_A12,11.692102,3.79538 +10X_cells.GTGGGTCGTGCAGTAG-L8TX_180221_01_C12,11.494483,3.9045696 +10X_cells.TTCTCAACATCATCCC-L8TX_180221_01_H11,11.706996,4.70555 +10X_cells.TTCTCCTCATACAGCT-L8TX_180221_01_H11,11.580471,4.477606 +10X_cells.TCCACACAGCCACCTG-L8TX_200611_02_A05,9.107893,3.046102 +10X_cells.CAGTAACTCTGCGGCA-L8TX_180712_01_F05,9.614941,6.8025374 +10X_cells.GTTCTCGAGAGTACAT-L8TX_180712_01_F05,10.709795,3.267443 +10X_cells.TCTTTCCGTGTGACCC-L8TX_180221_01_H11,11.715,4.4576497 +10X_cells.TTCGAAGGTCTTCAAG-L8TX_200611_02_A05,9.457865,4.005389 +10X_cells.AACCGCGAGACACTAA-L8TX_180712_01_E05,9.666493,4.3346133 +10X_cells.AAAGCAATCTAACTTC-L8TX_180221_01_H11,11.840145,4.265801 +10X_cells.CCGTGGAGTCCAGTAT-L8TX_180712_01_F05,11.099417,7.097063 +10X_cells.TTTCCTCGTCAACATC-L8TX_180712_01_H05,8.412823,3.3214028 +10X_cells.TCATTACTCTCGTATT-L8TX_200611_02_A05,9.12089,3.1346104 +10X_cells.TGCGTGGCAGTGGGAT-L8TX_180712_01_H05,12.045042,1.2219877 +10X_cells.CACATTTAGGCATGTG-L8TX_180712_01_E05,10.459521,1.4828054 +10X_cells.GTAACGTTCTCAACTT-L8TX_180221_01_B12,10.327134,5.923378 +10X_cells.CTACACCGTCAGTGGA-L8TX_180221_01_A12,10.847397,3.1429856 +10X_cells.CTCTGGTTCGTTGCCT-L8TX_180221_01_C12,10.892769,5.2149043 +10X_cells.AGCCTAAAGGATGGAA-L8TX_180712_01_E05,10.089882,5.682546 +10X_cells.TTTATGCCATTACCTT-L8TX_180712_01_F05,9.849292,5.4955997 +10X_cells.GTCACAATCAGCTCTC-L8TX_180712_01_H05,11.080839,1.8742622 +10X_cells.ACCTTTACATGTCCTC-L8TX_180221_01_H11,11.6867695,4.2932305 +10X_cells.TTGCCGTGTTACAGAA-L8TX_180712_01_F05,10.27885,7.024222 +10X_cells.CCTAGCTTCTGCAGTA-L8TX_180712_01_H05,9.612332,4.9700303 +10X_cells.AAAGATGTCGCTTAGA-L8TX_180221_01_H11,11.741522,3.9044812 +10X_cells.CTGATAGCAGGGTACA-L8TX_180221_01_A12,11.823272,4.3378067 +10X_cells.CGGCTAGTCAAGGTAA-L8TX_180712_01_F05,10.0188265,4.7536764 +10X_cells.TCATTTGAGTATCTCG-L8TX_180221_01_C12,10.762794,4.145903 +10X_cells.ACGGAGACATGGTCTA-L8TX_180221_01_A12,11.556884,3.4032853 +10X_cells.GACGTGCTCGGAGCAA-L8TX_180504_01_E01,9.905135,4.5836167 +10X_cells.CGATCGGAGCGTAATA-L8TX_180712_01_E05,9.605593,4.296165 +10X_cells.GCGCAGTTCCCTCTTT-L8TX_180221_01_A12,11.009107,3.9966261 +10X_cells.AGAGCTTGTGCCTGGT-L8TX_180712_01_A06,9.138127,4.071121 +10X_cells.ACGTCAATCATGCATG-L8TX_180504_01_E01,10.127749,5.9167385 +10X_cells.ATCTGCCCACTCTGTC-L8TX_180712_01_A06,9.190822,4.4035077 +10X_cells.TTTCCTCTCACAAACC-L8TX_180221_01_C12,10.338338,6.201392 +10X_cells.TACCTATCATACTCTT-L8TX_180221_01_C12,11.412315,0.84624773 +10X_cells.GCATGCGTCCACGTTC-L8TX_180712_01_A06,9.714261,3.4070504 +10X_cells.TGAGCCGTCACAACGT-L8TX_180221_01_C12,11.532159,2.374118 +10X_cells.ATTCTACCACATCCAA-L8TX_180712_01_A06,8.336091,2.0583434 +10X_cells.CTTCTCTAGACCTAGG-L8TX_180504_01_E01,10.595324,1.74617 +10X_cells.CCAGCGAAGCCAACAG-L8TX_180221_01_B12,10.456615,4.0886297 +10X_cells.ATCATCTGTAAGTTCC-L8TX_200611_02_A05,9.5986805,3.2350247 +10X_cells.CTGATAGCAACACCTA-L8TX_180712_01_H05,10.554844,5.6599946 +10X_cells.TTATGCTGTAAAGGAG-L8TX_180504_01_E01,9.919082,5.409743 +10X_cells.GGGAATGAGGAGTACC-L8TX_180221_01_C12,10.999845,4.858109 +10X_cells.TCGGGACAGCTCAACT-L8TX_200611_02_A05,10.994453,0.9390564 +10X_cells.GACGCGTCACCCATGG-L8TX_180712_01_E05,9.93013,5.314597 +10X_cells.CGTGAGCTCCAGATCA-L8TX_180712_01_E05,10.668724,6.203838 +Smartseq_cells.SM-GE677_S182_E1-50,9.783788,5.1704974 +10X_cells.CTGGTCTTCGTCGTTC-L8TX_180115_01_G10,11.099535,4.5331016 +10X_cells.ACGAGGATCGGTCCGA-L8TX_180115_01_C11,9.9643135,6.0716 +10X_cells.GTCCTCAAGGCTAGCA-L8TX_180115_01_G09,10.944697,6.301259 +10X_cells.GATCTAGTCGATAGAA-L8TX_180115_01_B11,9.890706,3.1936364 +10X_cells.AAGTCTGCAAGCCGCT-L8TX_180115_01_G09,8.275065,5.60541 +10X_cells.AGCGTCGGTTACGCGC-L8TX_180115_01_G10,10.745862,3.4105515 +10X_cells.AGCAGCCTCTGCCAGG-L8TX_180115_01_E10,10.128826,2.7721546 +10X_cells.TAAGTGCCAAACTGCT-L8TX_180115_01_B11,8.31359,3.366431 +10X_cells.TTGGCAAAGGCTACGA-L8TX_180115_01_F09,10.539459,5.5159655 +10X_cells.TCAGATGAGGTGCAAC-L8TX_180115_01_F09,11.170314,2.3289557 +10X_cells.CGAGCACTCGAGAACG-L8TX_180115_01_H10,7.0696077,4.352236 +10X_cells.CCTTCCCCATGCCACG-L8TX_180115_01_H10,8.53911,5.141339 +10X_cells.GAGTCCGTCTTCCTTC-L8TX_180115_01_F10,8.788175,-0.25772724 +10X_cells.GTATTCTGTTCCATGA-L8TX_180115_01_E10,7.230993,4.8391256 +10X_cells.GCGAGAATCAGTTAGC-L8TX_180115_01_H11,8.673563,2.841944 +10X_cells.CATCCACAGGGTTTCT-L8TX_180115_01_C11,10.577908,0.27723122 +10X_cells.TTGACTTTCTGGGCCA-L8TX_180115_01_H11,6.9968224,4.534847 +10X_cells.CAGCTAATCTAACCGA-L8TX_180115_01_G11,8.46831,0.18630968 +10X_cells.AATCGGTTCTTGTCAT-L8TX_180115_01_E10,9.558757,2.7391448 +10X_cells.CGTGTAAAGTGGAGAA-L8TX_180115_01_G11,10.63987,3.6215923 +10X_cells.TTCTACACAGTAAGAT-L8TX_180115_01_A11,8.780276,4.892041 +10X_cells.CGAGAAGTCGTTGACA-L8TX_180115_01_G10,10.207359,4.1862774 +10X_cells.GGGATGAGTAAGAGAG-L8TX_180115_01_F11,10.788515,5.28477 +10X_cells.TCTTTCCGTAAGCACG-L8TX_180115_01_D10,11.108209,2.9626477 +10X_cells.TCGGTAACAACTGGCC-L8TX_180115_01_H11,8.677737,3.2297542 +10X_cells.TACCTTAGTCAATGTC-L8TX_180115_01_B11,8.144823,2.7340362 +10X_cells.GACGGCTCAAACAACA-L8TX_180115_01_D09,8.19052,5.918705 +10X_cells.AGCGGTCTCAACACGT-L8TX_180115_01_F10,10.380001,0.34834546 +10X_cells.TCGTACCGTAGGGACT-L8TX_180115_01_E10,6.9306006,2.259342 +10X_cells.ACTGAGTTCACTTCAT-L8TX_180115_01_A10,11.184455,2.3836026 +10X_cells.AGTGAGGGTATAGGTA-L8TX_180115_01_F10,9.743574,0.91868544 +10X_cells.CGTTAGAGTTACGTCA-L8TX_180115_01_E11,8.678185,3.233236 +10X_cells.CTCTACGAGAAACGAG-L8TX_180115_01_F11,9.378543,0.7591821 +10X_cells.ACACCGGCAACTTGAC-L8TX_180115_01_G11,8.757929,3.5431387 +10X_cells.GACACGCTCCTGCAGG-L8TX_180115_01_B10,10.578994,4.207277 +10X_cells.TGCCCATAGTTCGATC-L8TX_180115_01_F10,9.028126,4.685033 +10X_cells.TTTACTGGTCACAAGG-L8TX_180115_01_B11,8.964995,1.3419113 +10X_cells.GGAATAAGTGTGGTTT-L8TX_180115_01_F11,9.306071,0.42732307 +10X_cells.CATGACAAGTGTTAGA-L8TX_180115_01_A11,9.303738,2.2007945 +10X_cells.GGCCGATAGCAGGTCA-L8TX_180115_01_B09,9.906594,0.7014618 +10X_cells.TAGACCAGTATAATGG-L8TX_180115_01_A11,8.023976,1.7683034 +10X_cells.GGCTCGAAGGTGCTAG-L8TX_180115_01_A09,8.996362,2.3994572 +10X_cells.GCACTCTCATCGACGC-L8TX_171120_01_H07,9.166884,3.9341366 +10X_cells.TGAGCCGGTCACTGGC-L8TX_171120_01_H07,9.008334,5.820105 +10X_cells.AGCCTAATCATGTCCC-L8TX_171120_01_G07,9.6599,3.6443121 +10X_cells.CACAGTAAGATATGCA-L8TX_171120_01_G07,10.793234,5.057668 +10X_cells.CCAATCCGTCCGTCAG-L8TX_171120_01_G07,9.131804,4.4146557 +10X_cells.CGTCAGGGTCTGCCAG-L8TX_171120_01_G07,9.741168,4.1673727 +10X_cells.CATATTCGTACCGAGA-L8TX_171120_01_H07,6.629422,4.302121 +10X_cells.GTCGTAACATCCGGGT-L8TX_171120_01_H07,6.9563255,4.2785997 +10X_cells.TTAACTCAGGAGTAGA-L8TX_180115_01_G08,8.391811,2.7692688 +10X_cells.CATCCACCAAGCCCAC-L8TX_171120_01_C07,8.476603,4.4820385 +10X_cells.CGTTCTGTCTGCTGTC-L8TX_171120_01_C07,9.871403,3.6152263 +10X_cells.AACTTTCCATACGCTA-L8TX_180115_01_H08,9.181661,5.558723 +10X_cells.AAACCTGTCGAGAGCA-L8TX_171120_01_D07,8.363546,0.87194955 +10X_cells.GAGCAGACAAAGAATC-L8TX_171120_01_D07,7.85643,3.678592 +10X_cells.GGGCATCTCGCGATCG-L8TX_171120_01_D07,9.559313,2.6939473 +10X_cells.ATGAGGGTCCACGAAT-L8TX_171120_01_E07,8.3977,3.045419 +10X_cells.CCTCTGACAGTAGAGC-L8TX_171120_01_E07,8.7024,2.7229517 +10X_cells.CTTAACTGTTTGGCGC-L8TX_171120_01_F07,7.9376373,3.9382985 +10X_cells.ATTCTACAGACAAGCC-L8TX_180115_01_E08,10.214631,4.2506657 +10X_cells.CTGGTCTGTCTCTTAT-L8TX_180115_01_E08,8.9350815,3.6476345 +10X_cells.TTGGAACTCTGAAAGA-L8TX_180115_01_E08,10.577699,3.0228255 +Smartseq_cells.LS-14696_S73_E1-50,9.097014,3.4895294 +Smartseq_cells.LS-15003_S16_E1-50,7.7713094,1.2108041 +Smartseq_cells.LS-15025_S63_E1-50,9.1717825,3.3102179 +Smartseq_cells.LS-15031_S88_E1-50,7.8879166,2.8252635 +Smartseq_cells.LS-15064_S64_E1-50,9.015458,2.1183212 +Smartseq_cells.LS-15068_S72_E1-50,9.259534,4.2975383 +Smartseq_cells.LS-15078_S49_E1-50,8.610553,1.7961296 +Smartseq_cells.LS-15080_S31_E1-50,9.19349,3.5182073 +Smartseq_cells.LS-15096_S64_E1-50,8.354482,3.2488234 +Smartseq_cells.LS-15576_S57_E1-50,8.405037,3.5840101 +Smartseq_cells.LS-15576_S62_E1-50,9.206435,3.5751455 +Smartseq_cells.SM-D9CXR_S26_E1-50,7.9451294,3.5320113 +Smartseq_cells.SM-D9CXR_S35_E1-50,7.8326073,2.8393054 +Smartseq_cells.SM-GE66C_S169_E1-50,9.01384,2.1016688 +Smartseq_cells.SM-GE67T_S049_E1-50,9.251594,3.552859 +Smartseq_cells.SM-GE8X5_S289_E1-50,7.0318522,3.2345924 +Smartseq_cells.SM-GE8X5_S295_E1-50,8.62732,3.016517 +Smartseq_cells.SM-GE8X5_S314_E1-50,9.083555,2.331391 +Smartseq_cells.SM-GE8X5_S315_E1-50,8.036658,2.8452013 +Smartseq_cells.SM-GE8X5_S316_E1-50,8.288181,2.605455 +Smartseq_cells.SM-GE8X6_S097_E1-50,8.532364,2.1471398 +Smartseq_cells.SM-GE8X6_S101_E1-50,8.4290085,2.9703658 +Smartseq_cells.SM-GE8X6_S103_E1-50,9.241257,3.5309465 +10X_cells.TGGGAAGCACACATGT-L8TX_180406_01_F02,10.159429,6.7484517 +10X_cells.CGTGAGCCACGTAAGG-L8TX_180221_01_F09,10.58166,6.262634 +10X_cells.AGCGGTCTCGTATCAG-L8TX_180221_01_G09,5.3014245,7.074123 +10X_cells.CATCAGATCTGTACGA-L8TX_180221_01_G09,5.395296,5.0399942 +10X_cells.TCAATCTTCTTCATGT-L8TX_180221_01_G09,7.7904606,5.8123317 +10X_cells.GAACCTAGTTCGTCTC-L8TX_180221_01_H09,6.3712544,6.7569027 +10X_cells.GAACATCTCTCGGACG-L8TX_180221_01_A10,7.734012,6.322546 +10X_cells.CATCAAGAGTATCTCG-L8TX_180221_01_B10,7.489157,5.0272183 +10X_cells.CCCTCCTCATGGGACA-L8TX_180221_01_B10,5.2343807,6.119867 +10X_cells.CGAGAAGGTCCATCCT-L8TX_180221_01_B10,6.6772947,3.0078464 +10X_cells.GGAGCAAAGTAACCCT-L8TX_180221_01_B10,5.2181897,2.826905 +10X_cells.ATGAGGGCAACTGCTA-L8TX_180221_01_C10,4.3920193,5.1144094 +10X_cells.CGATTGACAGGACCCT-L8TX_180221_01_C10,5.2358065,5.4426327 +10X_cells.CTTACCGCAAGGTTCT-L8TX_180221_01_C10,5.874662,3.564854 +10X_cells.TATCAGGAGCCACCTG-L8TX_180221_01_C10,5.758592,3.6417193 +10X_cells.TCAGATGAGCTAAGAT-L8TX_180221_01_C10,7.1480393,4.094254 +10X_cells.TCGTACCTCGCATGGC-L8TX_180221_01_C10,8.626509,5.8843236 +10X_cells.TGACAACAGACTCGGA-L8TX_180221_01_C10,5.3445964,4.6262274 +10X_cells.GACTACACAGCTGTAT-L8TX_180406_01_F02,6.4160643,6.831501 +10X_cells.GGGTCTGTCACGATGT-L8TX_180406_01_F02,6.50457,6.355611 +10X_cells.TGCGTGGTCTGCCAGG-L8TX_180712_01_G05,7.9158773,4.97567 +10X_cells.GGCAATTAGATGCCAG-L8TX_180712_01_G05,9.324469,6.84593 +10X_cells.AAACGGGCACTTGGAT-L8TX_180221_01_C09,9.762768,6.9856925 +10X_cells.CACCAGGGTCGAACAG-L8TX_180221_01_H12,9.845033,5.9759383 +10X_cells.CCATTCGAGAGACGAA-L8TX_180221_01_H12,7.9775004,5.254893 +10X_cells.ACACTGACACTTAACG-L8TX_180221_01_E09,4.830862,3.1509562 +10X_cells.GTCGGGTAGACTTGAA-L8TX_180221_01_E09,8.606392,5.010601 +10X_cells.AGCAGCCTCATATCGG-L8TX_180221_01_C09,9.721023,5.6423783 +10X_cells.ATCTACTGTGGGTCAA-L8TX_180221_01_C09,9.021182,6.332218 +10X_cells.CAAGTTGAGAGTACAT-L8TX_180221_01_C09,8.070242,5.49583 +10X_cells.CACCAGGAGCTAGGCA-L8TX_180221_01_C09,6.3919144,4.3050346 +10X_cells.CTTCTCTTCGGAGCAA-L8TX_180221_01_C09,8.531832,5.7104726 +10X_cells.GATTCAGGTAAGTGGC-L8TX_180221_01_C09,7.577504,5.254925 +10X_cells.TGCACCTAGAAAGTGG-L8TX_180221_01_C09,6.2209435,3.9151733 +10X_cells.TGCGTGGCAGGATCGA-L8TX_180221_01_C09,9.616847,6.167148 +10X_cells.ACACCCTAGTAATCCC-L8TX_180221_01_D09,5.270579,3.6854346 +10X_cells.ACGAGGAAGACCGGAT-L8TX_180221_01_D09,5.21339,5.4111733 +10X_cells.ACGTCAAAGAGACGAA-L8TX_180221_01_D09,10.185013,5.9655695 +10X_cells.ACTGATGTCTTAGCCC-L8TX_180221_01_D09,6.7913647,6.6564937 +10X_cells.GATCAGTTCTGCGGCA-L8TX_180221_01_D09,9.445574,6.3300095 +10X_cells.TGAGCCGCAGCCACCA-L8TX_180221_01_D09,7.2758737,4.3815985 +10X_cells.TTAACTCAGAGTAAGG-L8TX_180221_01_D09,7.7476015,5.105113 +10X_cells.AGCAGCCGTGAAGGCT-L8TX_180607_01_C05,6.0221977,5.4442916 +10X_cells.ATTATCCGTCTTCTCG-L8TX_180607_01_C05,4.9137044,3.3946764 +10X_cells.CTTCTCTCACACATGT-L8TX_180607_01_C05,5.0752387,4.049463 +10X_cells.GAGTCCGGTGGACGAT-L8TX_180607_01_C05,7.0778427,5.630521 +10X_cells.ACGAGGAGTATAGGGC-L8TX_180712_01_G05,4.2543373,5.308457 +10X_cells.CAAGTTGGTCAATACC-L8TX_180712_01_G05,8.266871,5.1280107 +10X_cells.CCACCTAGTAGGGACT-L8TX_180712_01_G05,6.5820146,2.06259 +10X_cells.CGATCGGAGACACTAA-L8TX_180712_01_G05,9.701114,5.8973002 +10X_cells.GTGGGTCCAGATGGCA-L8TX_180712_01_G05,5.599261,4.3858023 +10X_cells.GTTTCTACAGCCTTTC-L8TX_180712_01_G05,7.2185764,1.2433231 +10X_cells.TTTGCGCCATTGTGCA-L8TX_180712_01_G05,7.794988,6.357232 +10X_cells.AACTCCCAGCAAATCA-L8TX_180712_01_B06,10.999171,5.7525935 +10X_cells.AAGACCTAGGACAGAA-L8TX_180712_01_B06,8.887812,6.8017983 +10X_cells.CACATTTAGGATGGTC-L8TX_180712_01_B06,8.756343,5.5447516 +10X_cells.GAGCAGAGTGCAACTT-L8TX_180712_01_B06,13.952243,6.7415137 +10X_cells.GGGAATGAGAAAGTGG-L8TX_180712_01_B06,8.692815,5.9679904 +10X_cells.TCAGCAACAATCTACG-L8TX_180712_01_B06,8.729109,5.3954887 +10X_cells.TGAGGGATCTGCCCTA-L8TX_180712_01_B06,9.532032,6.749979 +10X_cells.TTGTAGGTCGACCAGC-L8TX_180712_01_B06,9.622354,6.59132 +10X_cells.ACACCAACAGCTGCAC-L8TX_180712_01_C06,8.6300745,5.6653123 +10X_cells.ACCAGTATCGTCGTTC-L8TX_180712_01_C06,7.9812036,5.9945445 +10X_cells.AGAATAGGTCATGCAT-L8TX_180712_01_C06,8.976365,6.1010365 +Smartseq_cells.SM-GE67M_S177_E1-50,5.569097,4.5488706 +Smartseq_cells.LS-15012_S02_E1-50,6.163529,4.8096642 +Smartseq_cells.LS-15306_S82_E1-50,7.1922445,5.9840827 +Smartseq_cells.LS-15326_S20_E1-50,6.9439907,5.186138 +Smartseq_cells.LS-15327_S43_E1-50,5.414654,5.180556 +Smartseq_cells.SQ-80004_S19_E1-50,6.994028,5.264355 +Smartseq_cells.SM-D9EPG_S80_E1-50,5.571004,4.739061 +Smartseq_cells.SM-D9CZE_S04_E1-50,5.7327633,5.792158 +Smartseq_cells.SM-D9D9E_S31_E1-50,5.4395947,4.659796 +Smartseq_cells.SM-D9D9E_S69_E1-50,5.457113,4.6858125 +Smartseq_cells.SM-GE672_S022_E1-50,6.79398,3.6401374 +10X_cells.AGCGGTCGTTACGACT-L8TX_181012_01_E05,9.513953,5.772756 +10X_cells.CCTAGCTGTATGAATG-L8TX_180829_01_D09,9.251239,6.232878 +10X_cells.GATCGCGTCGGTGTTA-L8TX_180829_01_D09,10.304786,6.1149297 +10X_cells.ACGTCAAGTCTGATCA-L8TX_180829_01_D10,5.233088,4.8606515 +10X_cells.CGTTAGATCATCATTC-L8TX_180829_01_D10,9.981593,6.483461 +10X_cells.CTTCTCTAGGTGTGGT-L8TX_180829_01_E10,8.609993,6.7091236 +10X_cells.AAGCCGCAGCGCCTTG-L8TX_180907_01_F10,10.031352,5.8602157 +10X_cells.CTTAACTCATGTCCTC-L8TX_180907_01_F10,7.661097,5.6206737 +10X_cells.GGCGTGTGTGGCAAAC-L8TX_180907_01_F10,7.1296215,7.0425973 +10X_cells.CATATTCGTCTAAAGA-L8TX_180907_01_G10,7.1443505,7.051119 +10X_cells.ATGAGGGTCATGTAGC-L8TX_181012_01_G04,5.568838,6.8802834 +10X_cells.ACGGGTCAGAGGGCTT-L8TX_181012_01_H04,9.856772,6.706092 +10X_cells.AGGGATGTCAACGGGA-L8TX_181012_01_E05,10.854648,6.146485 +10X_cells.CAGGTGCGTAGCCTAT-L8TX_181012_01_E05,9.211495,6.669632 +10X_cells.CCCAATCTCAGCGACC-L8TX_181012_01_E05,9.525454,6.9391446 +10X_cells.CTACCCAGTCGACTAT-L8TX_181012_01_E05,11.559973,5.499622 +10X_cells.GACCTGGCAGCCACCA-L8TX_181012_01_E05,5.2784977,5.192308 +Smartseq_cells.SM-GE5VT_S168_E1-50,7.352715,4.25744 +10X_cells.TCAACGAAGGAATTAC-L8TX_180406_01_H02,6.18991,2.112517 +10X_cells.CTTCTCTTCATCTGTT-L8TX_180406_01_H02,6.2886777,6.4133263 +10X_cells.CTTTGCGAGGTAGCCA-L8TX_180406_01_H01,9.045249,7.206285 +10X_cells.GAAACTCTCGTATCAG-L8TX_180406_01_E02,7.658313,3.6730447 +10X_cells.TGCTACCAGACCCACC-L8TX_180406_01_G02,2.055055,6.661759 +10X_cells.TTAGTTCCATTGTGCA-L8TX_180406_01_G02,8.490848,7.0752883 +10X_cells.AACTCTTCAGTCTTCC-L8TX_180406_01_E06,7.616057,5.517505 +10X_cells.ACCGTAAAGTCACGCC-L8TX_180406_01_C08,6.748963,3.1282911 +10X_cells.CGAGCCAAGCGTTGCC-L8TX_180406_01_C07,1.3490635,6.55897 +10X_cells.GCACATAGTGTTCGAT-L8TX_180406_01_E07,2.3407264,6.3746233 +10X_cells.GTAGGCCGTTTAGGAA-L8TX_180406_01_E07,1.9983937,6.9874406 +10X_cells.TGCGCAGTCTGTCTAT-L8TX_180406_01_E07,9.533557,6.987759 +Smartseq_cells.SM-GE914_S292_E1-50,5.0607276,6.3209085 +Smartseq_cells.SM-GE91C_S243_E1-50,6.615566,4.5082483 +Smartseq_cells.SM-GE91C_S273_E1-50,5.2691946,6.399086 +10X_cells.TCGGTAATCAACCATG-L8TX_200625_02_F11,9.886129,11.821125 +Smartseq_cells.SM-GE8ZR_S080_E1-50,5.1923885,5.7448664 +10X_cells.CTAAGACTCGTCCGTT-L8TX_171026_01_H04,9.445814,6.3918424 +10X_cells.GAGTCCGTCGCTTAGA-L8TX_171026_01_F03,5.3714423,3.7788062 +10X_cells.AGTAGTCTCTTGCCGT-L8TX_171026_01_G03,5.229728,4.1069365 +10X_cells.CAGAATCCATTGCGGC-L8TX_171026_01_G03,6.682893,4.415942 +10X_cells.TTTGGTTGTTGGTAAA-L8TX_171026_01_G03,5.7092876,4.9789896 +10X_cells.CATCGAAAGCGTAATA-L8TX_171026_01_B04,6.002665,5.1045575 +10X_cells.CGAACATCATCATCCC-L8TX_171026_01_B04,6.6074643,7.0753508 +10X_cells.TTCTCAAAGTGTCCCG-L8TX_171026_01_B04,7.7692127,4.6836767 +10X_cells.AAAGATGTCAACACCA-L8TX_171026_01_F04,9.225378,5.9929304 +10X_cells.CAAGGCCAGGTAGCTG-L8TX_171026_01_F04,4.5565987,4.610165 +10X_cells.CAGCTGGCAATTGCTG-L8TX_171026_01_F04,4.978612,4.4257135 +10X_cells.CAGTCCTGTTGGTTTG-L8TX_171026_01_F04,8.325068,6.624333 +10X_cells.ACGCCAGCAGCGATCC-L8TX_171026_01_G04,4.802204,5.2566853 +10X_cells.GCTCCTAGTCATACTG-L8TX_171026_01_G04,7.662668,6.6408553 +10X_cells.ATTGGACTCGTCTGAA-L8TX_171026_01_B05,5.663766,4.892922 +10X_cells.CACATTTCAGCCAATT-L8TX_171026_01_B05,15.007874,7.30852 +10X_cells.CTACATTGTTGTTTGG-L8TX_171026_01_B05,7.2548647,5.1210265 +10X_cells.GATGAGGCAGGTCGTC-L8TX_171026_01_B05,6.595747,5.240965 +10X_cells.CAGAGAGGTTAAGACA-L8TX_171026_01_H04,7.5800443,5.232477 +10X_cells.CATTCGCTCAGTTAGC-L8TX_171026_01_H04,7.214431,5.4383645 +10X_cells.GACGGCTTCTCGCATC-L8TX_171026_01_H04,7.1432624,5.8686314 +10X_cells.ACGATGTGTCCGAAGA-L8TX_171026_01_A05,9.673684,5.8397107 +10X_cells.CACAAACTCCGCGCAA-L8TX_171026_01_A05,6.481947,4.1554203 +10X_cells.CACAGGCCAAGTCTAC-L8TX_171026_01_A05,7.7816486,5.108664 +10X_cells.CATATGGTCGCGGATC-L8TX_171026_01_A05,9.153763,6.333143 +10X_cells.CTCCTAGGTCATTAGC-L8TX_171026_01_A05,6.2545285,5.2680902 +10X_cells.ATTACTCTCGACCAGC-L8TX_171026_01_H03,9.593041,6.5099664 +10X_cells.CCGTTCAGTGCAACGA-L8TX_171026_01_H03,6.2365503,5.4331317 +10X_cells.CGGCTAGGTCATGCAT-L8TX_171026_01_H03,6.752907,4.6659822 +10X_cells.CTAGAGTAGATGCGAC-L8TX_171026_01_H03,7.4743795,6.973689 +10X_cells.GTTACAGTCCTAGTGA-L8TX_171026_01_H03,3.7474356,6.452033 +10X_cells.CGCTTCACATGCCTTC-L8TX_171026_01_C05,10.181163,6.5040636 +10X_cells.CTCGAGGCACCAGGCT-L8TX_171026_01_C05,3.7836905,6.433007 +10X_cells.GCGCGATAGGGTATCG-L8TX_171026_01_C05,6.2229857,7.0472207 +10X_cells.TCTTCGGGTAGCTGCC-L8TX_171026_01_C05,8.912467,6.7270765 +10X_cells.ACGATACCAAATCCGT-L8TX_171026_01_D05,7.239928,2.9299166 +10X_cells.GATTCAGAGCCATCGC-L8TX_171026_01_D05,6.6693754,6.919388 +10X_cells.TTAGGCAGTTCTCATT-L8TX_171026_01_D05,7.939623,7.0581737 +10X_cells.ATTTCTGCATGCGCAC-L8TX_171026_01_E05,3.9997714,5.490107 +10X_cells.CCGTTCAAGTGACTCT-L8TX_171026_01_E05,8.399388,6.7893257 +10X_cells.CGTTAGATCGCCGTGA-L8TX_171026_01_E05,6.8677444,5.8670707 +10X_cells.GAGCAGAAGTAAGTAC-L8TX_171026_01_E05,11.347482,5.612962 +10X_cells.AAGTCTGCACATGGGA-L8TX_171026_01_F05,5.4921656,5.095041 +10X_cells.TACGGATTCATCGCTC-L8TX_171026_01_F05,6.8762956,4.1188326 +10X_cells.TAGGCATAGACCGGAT-L8TX_171026_01_F05,7.1844687,6.313863 +10X_cells.TGAGGGACACCACCAG-L8TX_171026_01_F05,8.36869,6.094782 +10X_cells.CATCGGGCAGGTGCCT-L8TX_171026_01_G05,4.871448,7.1128306 +10X_cells.CTCGTACGTATAGGTA-L8TX_171026_01_G05,9.632081,5.420418 +10X_cells.CTGCCTAAGAAGCCCA-L8TX_171026_01_G05,6.926336,6.8838816 +10X_cells.GGACGTCGTCAGGACA-L8TX_171026_01_G05,3.9966202,5.65529 +10X_cells.GGACGTCGTGTTTGTG-L8TX_171026_01_G05,6.03234,7.3583727 +10X_cells.GTATCTTAGACGCAAC-L8TX_171026_01_G05,7.327747,5.45889 +10X_cells.TTTGCGCGTCGTCTTC-L8TX_171026_01_G05,8.128015,6.731588 +10X_cells.GCGACCATCAACACAC-L8TX_171026_01_H05,6.486789,6.854749 +10X_cells.TACTTGTGTGTTGGGA-L8TX_171026_01_H05,8.135219,5.030338 +10X_cells.TTTATGCTCCAAACAC-L8TX_171026_01_H05,7.1963835,5.188312 +Smartseq_cells.SM-DD44N_S31_E1-50,4.9541407,5.370964 +Smartseq_cells.SM-GE935_S215_E1-50,7.2042418,6.0010247 +10X_cells.ACGAGGACACGTTGGC-L8TX_181206_01_H11,10.0447855,6.0790286 +10X_cells.GGCTCGAGTATAAACG-L8TX_181206_01_A12,11.968329,5.523257 +10X_cells.AAACCTGTCTGCTGCT-L8TX_181206_01_C12,8.175818,7.034651 +10X_cells.AACCATGTCCTAGTGA-L8TX_181206_01_C12,10.089702,5.857222 +10X_cells.TATCAGGCAATAAGCA-L8TX_181206_01_D12,9.480658,5.890455 +10X_cells.CCTACCAGTAAGTTCC-L8TX_181206_01_E12,4.0080304,6.169611 +10X_cells.CGTCCATGTATTCGTG-L8TX_181206_01_E12,8.14665,5.3160367 +10X_cells.GCGCAACGTTCGTTGA-L8TX_181206_01_E12,5.516163,5.3744116 +10X_cells.TCTCATAGTTTGTGTG-L8TX_181206_01_E12,5.992013,7.0401654 +10X_cells.TCGTAGACAGGTTTCA-L8TX_180406_01_B02,10.896979,7.3337126 +Smartseq_cells.SM-GE8Z7_S383_E1-50,7.834131,5.1469297 +10X_cells.AGGTCCGTCCACGAAT-L8TX_190312_01_D02,8.738897,5.9209657 +10X_cells.GACCTGGGTGCCTGGT-L8TX_180221_01_E10,8.38255,6.220593 +10X_cells.CTGCGGACACATAACC-L8TX_180221_01_F10,9.004874,7.0824943 +10X_cells.TCGGGACTCGGATGTT-L8TX_180221_01_F10,1.9441482,6.4631042 +10X_cells.CAGTAACCATATGGTC-L8TX_180221_01_D10,7.5995636,3.8888128 +10X_cells.CTGATAGCAGACGCTC-L8TX_180221_01_D10,5.917509,4.654161 +10X_cells.GACGTTACATCGGTTA-L8TX_180221_01_D10,9.453921,5.9800262 +10X_cells.GACGTTATCAACCAAC-L8TX_180221_01_D10,7.4013767,3.875885 +10X_cells.GGGTTGCAGAGTGAGA-L8TX_180221_01_D10,8.374413,5.2522526 +10X_cells.GTGTGCGAGGCCCGTT-L8TX_180221_01_D10,7.2351704,5.577133 +10X_cells.CAGCTAAAGTCAATAG-L8TX_180221_01_E10,6.2154484,3.1109335 +10X_cells.CATTCGCCACCATGTA-L8TX_180221_01_E10,5.054676,6.6767254 +10X_cells.GCCAAATGTTAAGGGC-L8TX_180221_01_E10,8.803604,4.322208 +10X_cells.GTCAAGTTCCGATATG-L8TX_180221_01_E10,3.9287791,6.470248 +10X_cells.CCTTACGCAAGCCGTC-L8TX_180221_01_F10,9.205616,6.346239 +10X_cells.CGGACTGGTTACGCGC-L8TX_180221_01_F10,10.092961,6.449602 +10X_cells.CGGAGTCTCCAAACTG-L8TX_180221_01_F10,9.450845,4.9001055 +10X_cells.CGTAGCGAGTGAATTG-L8TX_180221_01_F10,7.7970967,5.571489 +10X_cells.GGAATAAGTTTAGCTG-L8TX_180221_01_F10,9.678394,6.8225784 +10X_cells.CTCTAATGTGTAACGG-L8TX_180221_01_H10,7.00585,3.8542142 +10X_cells.GACGTTAGTTCCATGA-L8TX_180221_01_H10,6.7219524,5.7462196 +10X_cells.GCATGATGTTAAGAAC-L8TX_180221_01_A11,9.309492,6.6836543 +10X_cells.TTTGTCACACCAACCG-L8TX_180221_01_A11,5.952247,2.4059117 +10X_cells.AAGACCTAGCCTATGT-L8TX_190312_01_B02,7.478176,5.232312 +10X_cells.ACTGAGTCAATGGTCT-L8TX_190312_01_C02,4.334142,5.323818 +10X_cells.GCGCCAACAGTCAGAG-L8TX_190312_01_C02,7.4197936,4.8268137 +10X_cells.GGTATTGGTCTCGTTC-L8TX_190312_01_C02,6.769807,1.7234967 +10X_cells.ATCATGGCACGGATAG-L8TX_190312_01_D02,7.3602014,4.4990244 +10X_cells.CAGAATCAGAGGGATA-L8TX_190312_01_G02,6.5324883,5.873935 +10X_cells.CTGTTTACACCATGTA-L8TX_180926_01_C12,7.325552,6.2975116 +10X_cells.CTACATTCATCCTTGC-L8TX_181012_01_B05,9.852083,5.39222 +10X_cells.GTGCGGTAGTGGTCCC-L8TX_181012_01_B05,6.787414,7.151693 +10X_cells.TCGAGGCCATGGGAAC-L8TX_180221_01_B11,8.849068,6.4143496 +10X_cells.TTCTACAAGTCATCCA-L8TX_180221_01_C11,9.072621,5.791443 +10X_cells.AGGGATGTCAGAGACG-L8TX_190312_01_A03,7.212341,3.286099 +Smartseq_cells.SM-GE67Q_S185_E1-50,5.5517006,4.8385644 +10X_cells.ATAACGCCATTGTGCA-L8TX_180907_01_H11,14.209328,12.436795 +10X_cells.CAGCGACTCAAACAAG-L8TX_180907_01_A12,4.37158,7.1529098 +10X_cells.GTCCTCAAGCACGCCT-L8TX_180907_01_B12,8.155392,6.4714923 +Smartseq_cells.SM-D9E4J_S06_E1-50,6.6598134,4.4771714 +Smartseq_cells.SM-D9E5S_S30_E1-50,6.9812865,5.2508454 +Smartseq_cells.SM-GE5UT_S161_E1-50,6.9489665,6.207277 +10X_cells.ACTATCTCAATGCCAT-L8TX_180926_01_D01,9.62602,6.4986362 +10X_cells.GTGCAGCAGCATGGCA-L8TX_180926_01_D01,14.14461,6.1362453 +10X_cells.CGAGCACTCAGCGACC-L8TX_180926_01_E01,6.1037765,4.829267 +10X_cells.TGTATTCGTAAACCTC-L8TX_180926_01_E01,7.406828,5.424992 +10X_cells.TTCCCAGCAATGGAAT-L8TX_180926_01_F01,8.122818,6.299432 +10X_cells.ACACCGGTCGGACAAG-L8TX_181011_01_B03,5.9402585,7.272982 +10X_cells.ACTGCTCTCATCTGCC-L8TX_181011_01_B03,8.372407,6.160032 +10X_cells.CGATGGCAGCGCCTCA-L8TX_181011_01_B03,8.813589,5.917714 +10X_cells.GTATCTTAGGCATGTG-L8TX_181011_01_B03,6.377062,2.7063947 +10X_cells.CACAGGCGTTGCTCCT-L8TX_180221_01_H11,11.761253,4.471481 +10X_cells.GTACTCCGTCCTAGCG-L8TX_180504_01_E01,9.160558,5.078383 +10X_cells.AAGTCTGTCCCAGGTG-L8TX_180221_01_C12,11.186056,4.8659697 +10X_cells.GTACTTTGTTCCGGCA-L8TX_180712_01_E05,9.659605,6.2817335 +10X_cells.TCATTTGGTGCAGACA-L8TX_180712_01_E05,7.2594976,6.060999 +10X_cells.TCGGGACGTTGGGACA-L8TX_180712_01_E05,4.5252852,7.1303735 +10X_cells.TACTTACGTTACGGAG-L8TX_180712_01_F05,1.735954,6.399383 +10X_cells.TTTGTCAAGTGGCACA-L8TX_180712_01_F05,9.858184,6.6095595 +10X_cells.ACCAGTAAGTAGTGCG-L8TX_180712_01_H05,4.2517776,5.4453216 +10X_cells.ACGATGTAGCAGACTG-L8TX_180712_01_H05,8.954753,6.3213162 +10X_cells.CATATTCCACAGAGGT-L8TX_180712_01_H05,10.491958,6.321504 +10X_cells.CGGAGCTGTAGTGAAT-L8TX_180712_01_H05,11.961904,6.466494 +10X_cells.CTTAGGAGTACTTGAC-L8TX_180712_01_H05,6.277554,7.1804824 +10X_cells.GCGAGAATCGCCTGAG-L8TX_180712_01_H05,3.4575648,6.4901023 +10X_cells.GGCTGGTAGACACTAA-L8TX_180712_01_H05,7.1316104,5.280997 +10X_cells.TCAGGATCATTTCACT-L8TX_180712_01_H05,5.95549,6.2737265 +10X_cells.TGCGTGGGTGCTCTTC-L8TX_180712_01_H05,4.627594,2.332182 +10X_cells.TGGGAAGTCGGGAGTA-L8TX_180712_01_H05,8.216206,6.7920766 +10X_cells.TTGGAACGTTGTCTTT-L8TX_180712_01_H05,9.328527,5.939578 +10X_cells.AACTGGTAGCTCTCGG-L8TX_180712_01_A06,9.426937,6.2468657 +10X_cells.GCTGCGACAGATTGCT-L8TX_180712_01_A06,9.197471,6.373117 +10X_cells.TCGGGACAGTGGGTTG-L8TX_180504_01_E01,8.334433,6.5813766 +10X_cells.CATCCACGTCTAGTCA-L8TX_180221_01_B12,8.7254505,6.139347 +10X_cells.CATCGAATCAGGCAAG-L8TX_180221_01_B12,10.079893,6.614999 +10X_cells.CGACTTCTCAAACGGG-L8TX_180221_01_B12,9.622325,6.590833 +10X_cells.AGCTCTCAGTGTGAAT-L8TX_180221_01_C12,9.863273,6.628057 +10X_cells.AGTGAGGGTGTATGGG-L8TX_180221_01_C12,8.974417,6.8506346 +10X_cells.ATTCTACAGTACATGA-L8TX_180221_01_C12,10.000774,6.5264215 +10X_cells.CATCGGGTCCACGTTC-L8TX_180221_01_C12,7.669957,5.359744 +10X_cells.CGTGTCTCATTGGTAC-L8TX_180221_01_C12,10.596585,6.6896386 +10X_cells.CGTTCTGAGTGCGATG-L8TX_180221_01_C12,7.988174,5.8019753 +10X_cells.GTACTTTGTTCACCTC-L8TX_180221_01_C12,9.696207,6.6564894 +10X_cells.TTCGAAGAGAGGTAGA-L8TX_180221_01_C12,6.8924255,7.295043 +10X_cells.GCACTCTGTAGGCTGA-L8TX_180221_01_D12,9.466696,6.9187474 +10X_cells.AGTGTCAGTGTATGGG-L8TX_180221_01_H11,11.524655,4.803879 +10X_cells.CATCAAGGTTCAGCGC-L8TX_180221_01_H11,11.743599,5.3487062 +10X_cells.CGTAGGCCATCCGTGG-L8TX_180221_01_H11,11.828248,4.4996076 +10X_cells.GATTCAGTCAGCTCTC-L8TX_180221_01_H11,11.812926,4.4761834 +10X_cells.ATAGACCGTCCAAGTT-L8TX_200611_02_A05,4.916128,5.3486958 +10X_cells.ATTGGACGTCCTAGCG-L8TX_200611_02_A05,7.844297,5.339941 +10X_cells.CGACTTCGTTCCAACA-L8TX_200611_02_A05,9.067374,6.349881 +10X_cells.GCTTCCATCCGCGTTT-L8TX_200611_02_A05,6.5241036,5.132756 +10X_cells.TCAATCTAGCCACGTC-L8TX_200611_02_A05,7.854535,5.210332 +Smartseq_cells.SM-GE677_S273_E1-50,6.9561124,4.5634065 +10X_cells.GTTCGGGGTTAGATGA-L8TX_180115_01_H10,9.449895,6.000879 +10X_cells.CGCTATCTCAATAAGG-L8TX_180115_01_G11,5.52173,7.019339 +10X_cells.CGACCTTCACACGCTG-L8TX_180115_01_B09,4.9324703,6.9432783 +10X_cells.GTTCGGGTCGTGGACC-L8TX_180115_01_B09,7.969191,6.2022347 +10X_cells.GGAACTTGTTCCGGCA-L8TX_180115_01_C09,6.8397274,6.5848083 +10X_cells.TTTGCGCGTTTGTGTG-L8TX_180115_01_C09,7.6127715,7.0519323 +10X_cells.CTGTGCTAGGCAGTCA-L8TX_180115_01_D10,0.089504436,8.658432 +10X_cells.TCAGCAAAGAGACTTA-L8TX_180115_01_A11,6.9055223,4.953746 +10X_cells.AGCATACCATATGCTG-L8TX_180115_01_H10,6.333173,6.4365387 +10X_cells.CCACTACCAGAGTGTG-L8TX_180115_01_H10,7.88737,5.1764617 +10X_cells.AACTTTCGTAGCTTGT-L8TX_180115_01_B10,5.904835,5.8219223 +10X_cells.ACTTTCATCCCTTGTG-L8TX_180115_01_B10,8.272668,6.8418517 +10X_cells.TCCACACGTAAGCACG-L8TX_180115_01_B10,7.119038,7.0100026 +10X_cells.CGCTATCGTAAGAGAG-L8TX_180115_01_B11,6.951135,4.838675 +10X_cells.ACGTCAACAGCCTTGG-L8TX_180115_01_C11,6.92985,3.8945084 +10X_cells.ACTTGTTCAAGGGTCA-L8TX_180115_01_C11,7.5919714,5.7905507 +10X_cells.ATAAGAGGTCTAACGT-L8TX_180115_01_C11,8.192594,3.632039 +10X_cells.CCTTACGAGCAGCCTC-L8TX_180115_01_C11,4.6651926,5.5249405 +10X_cells.CTCGAAAGTCTAACGT-L8TX_180115_01_C11,5.3473473,5.9102526 +10X_cells.AACCGCGGTCAGATAA-L8TX_180115_01_D11,6.7923265,6.8583684 +10X_cells.GGAATAACAAGAAAGG-L8TX_180115_01_D11,4.1628456,5.3969765 +10X_cells.CAGCAGCTCCTTCAAT-L8TX_180115_01_E10,4.607654,5.00816 +10X_cells.TCTCTAAAGACACGAC-L8TX_180115_01_E10,7.1081142,6.908638 +10X_cells.TAGGCATTCGTAGATC-L8TX_180115_01_F10,7.6949005,5.9739394 +10X_cells.TGCGTGGTCCTTGGTC-L8TX_180115_01_F10,5.730717,6.6278825 +10X_cells.CTTGGCTGTATGCTTG-L8TX_180115_01_G10,7.0986114,6.0796657 +10X_cells.GCAGCCACAAGCCTAT-L8TX_180115_01_G10,8.024897,5.865322 +10X_cells.CGCTTCATCCTTGCCA-L8TX_180115_01_E11,7.728839,6.5465236 +10X_cells.GTCATTTCAAGCGATG-L8TX_180115_01_E11,8.957317,5.7737536 +10X_cells.GTCTCGTGTCGAGTTT-L8TX_180115_01_E11,5.3545885,6.993138 +10X_cells.TATGCCCGTACTCAAC-L8TX_180115_01_E11,5.75823,6.5485287 +10X_cells.TTTATGCGTACCGTAT-L8TX_180115_01_E11,7.8501577,6.8863316 +10X_cells.CACATTTAGAGGTTAT-L8TX_180115_01_F11,6.4044485,6.83399 +10X_cells.CGAGCACAGAAGATTC-L8TX_180115_01_F11,8.704591,6.502882 +10X_cells.CTCGGAGTCGGTCCGA-L8TX_180115_01_F11,6.8742414,6.807712 +10X_cells.GGGAGATCATTTCAGG-L8TX_180115_01_F11,8.808877,5.850505 +10X_cells.TTGACTTGTCATGCCG-L8TX_180115_01_F11,7.68637,4.8754206 +10X_cells.ATCCACCAGTTAACGA-L8TX_180115_01_H11,5.989004,6.999614 +10X_cells.GTTAAGCAGTTTCCTT-L8TX_180115_01_H11,6.4738607,5.2434177 +10X_cells.TAGTGGTTCTCTTATG-L8TX_180115_01_H11,7.3519325,5.633965 +10X_cells.TCAATCTTCGAGAACG-L8TX_180115_01_H11,6.8765717,7.0451756 +10X_cells.TGGCTGGTCAGCGATT-L8TX_180115_01_H11,8.231908,7.077916 +10X_cells.CAAGTTGTCCGATATG-L8TX_180115_01_H09,7.6991405,6.9074674 +10X_cells.GCGACCATCGGACAAG-L8TX_180115_01_H09,7.517942,6.96333 +10X_cells.TATCTCAAGTGGGTTG-L8TX_180115_01_A10,7.1583915,7.158277 +10X_cells.AACTGGTGTTCGTTGA-L8TX_180115_01_E09,5.805751,7.0933604 +10X_cells.CCACTACAGCCATCGC-L8TX_180115_01_E09,8.005358,6.420854 +10X_cells.CGGACGTTCACTTACT-L8TX_180115_01_F09,7.884605,4.660532 +10X_cells.CGGAGTCGTCTAGTCA-L8TX_180115_01_F09,7.0973134,7.1109967 +10X_cells.GTAGTCAAGTACGTTC-L8TX_180115_01_F09,5.8961363,6.293414 +10X_cells.TCAACGAAGGAGTAGA-L8TX_171120_01_G07,7.2873855,5.6910777 +10X_cells.TGGCTGGCAGCAGTTT-L8TX_171120_01_H07,6.1807537,6.103116 +10X_cells.TTAGTTCCACGGTAGA-L8TX_180115_01_G08,4.5455275,4.5351367 +10X_cells.AACTTTCGTCTCCATC-L8TX_171120_01_C07,6.7885323,6.5789723 +10X_cells.TGAGCATCATCGGAAG-L8TX_171120_01_C07,6.569145,7.21575 +10X_cells.GAGGTGAGTAGGGTAC-L8TX_180115_01_H08,8.199556,6.157436 +10X_cells.ACAGCTAAGTGCTGCC-L8TX_171120_01_D07,7.8377376,4.8896875 +10X_cells.TCAACGATCAGTTTGG-L8TX_171120_01_D07,4.905973,7.148744 +10X_cells.AGTGTCAAGTTGTAGA-L8TX_171120_01_E07,5.3674383,4.972335 +10X_cells.AAACGGGTCCTATTCA-L8TX_180115_01_F08,6.9777956,5.027935 +10X_cells.ACGAGGAGTCTAAACC-L8TX_180115_01_F08,8.004427,4.997406 +10X_cells.CTAGTGAAGAGACTAT-L8TX_180115_01_F08,8.4300995,4.999391 +10X_cells.ACTGATGTCAAACAAG-L8TX_180115_01_E08,4.8666945,4.913964 +10X_cells.CGTCACTTCTTTAGTC-L8TX_180115_01_E08,4.089379,5.827399 +Smartseq_cells.LS-15015_S22_E1-50,6.918153,3.9703486 +Smartseq_cells.LS-15064_S34_E1-50,5.8392687,5.726213 +Smartseq_cells.LS-15075_S67_E1-50,5.265712,4.105579 +Smartseq_cells.LS-15085_S54_E1-50,5.507292,6.4039197 +Smartseq_cells.LS-15096_S82_E1-50,6.85787,4.737446 +Smartseq_cells.LS-15351_S80_E1-50,5.62238,4.767252 +Smartseq_cells.LS-15576_S63_E1-50,5.854723,4.698187 +Smartseq_cells.SM-D9EP8_S32_E1-50,6.540544,4.4150963 +Smartseq_cells.SM-D9CXQ_S01_E1-50,6.3139424,4.646173 +Smartseq_cells.SM-D9CXR_S33_E1-50,7.018813,4.860306 +Smartseq_cells.SM-GE631_S032_E1-50,5.75572,4.7633705 +Smartseq_cells.SM-GE672_S136_E1-50,5.3141975,6.1450806 +Smartseq_cells.SM-GE67W_S340_E1-50,7.3218045,4.67241 +10X_cells.CAGCAGCGTCACCCAG-L8TX_180406_01_F02,8.215682,5.363762 +10X_cells.ACGATGTAGTCCTCCT-L8TX_180221_01_E09,6.23476,4.6524158 +10X_cells.GTACGTAAGATGTAAC-L8TX_180221_01_C09,7.2138057,3.843517 +10X_cells.ATTATCCTCATGGTCA-L8TX_180607_01_C05,6.4104543,2.9804637 +10X_cells.CCCAATCAGTATCTCG-L8TX_180712_01_B06,7.6337624,3.2340608 +10X_cells.AACTCCCCAGGGTACA-L8TX_181012_01_G04,6.8335457,4.573712 +10X_cells.GGGCACTGTCATCGGC-L8TX_181011_01_H02,6.4839115,3.681983 +10X_cells.ACTTTCAAGGGTTTCT-L8TX_181012_01_G04,6.4984746,4.584404 +Smartseq_cells.SM-GE5VB_S076_E1-50,5.960081,4.3926096 +10X_cells.TCATTACGTCTCCACT-L8TX_171026_01_G04,5.5159264,4.2411036 +10X_cells.TGGCTGGAGGCAGGTT-L8TX_171026_01_H03,6.2574067,4.6496124 +10X_cells.AGAGCTTCATAGAAAC-L8TX_171026_01_A04,7.9904695,4.797823 +10X_cells.GTACTTTCACCCTATC-L8TX_171026_01_C05,4.4274025,4.590345 +10X_cells.ACCCACTAGTGGACGT-L8TX_171026_01_D05,4.7548776,4.3797197 +10X_cells.GAACATCCACTGTCGG-L8TX_171026_01_E05,6.5654616,4.644324 +10X_cells.TTAACTCGTAGGGTAC-L8TX_171026_01_E05,5.430392,3.8368168 +10X_cells.CATGGCGCATCTATGG-L8TX_171026_01_F05,5.6452045,3.7264848 +10X_cells.CTGATCCGTAAACGCG-L8TX_171026_01_F05,5.7300243,3.5498738 +10X_cells.ACGGGCTGTAAGGATT-L8TX_181206_01_H11,6.3747554,4.2307854 +10X_cells.CGATCGGCAACCGCCA-L8TX_181206_01_H11,6.781551,4.5051847 +10X_cells.GGTGCGTTCTGCAGTA-L8TX_181206_01_D12,7.4992595,5.3545294 +10X_cells.CACCAGGGTCTTGATG-L8TX_180221_01_D10,5.8721747,4.0459523 +10X_cells.CACTCCAAGGCATGTG-L8TX_180221_01_D10,4.613143,4.4981656 +10X_cells.ACGCAGCGTCACTGGC-L8TX_190312_01_B02,6.618601,3.8508852 +10X_cells.GGCTGGTTCAACACTG-L8TX_180907_01_B11,6.1280127,3.414372 +10X_cells.ACATACGTCAGAGCTT-L8TX_180926_01_C12,5.1866407,4.058844 +10X_cells.CAAGGCCGTTTGTGTG-L8TX_180221_01_B11,8.127639,4.5927567 +10X_cells.GTAACTGAGCGCTTAT-L8TX_180221_01_B11,8.5248575,5.121907 +10X_cells.CAAGATCAGAAGGCCT-L8TX_180712_01_A06,7.7594,3.5868084 +10X_cells.CGTAGGCGTAATCGTC-L8TX_180712_01_E05,10.177002,6.0149016 +10X_cells.GAGCAGACAAGCGAGT-L8TX_180115_01_A11,6.2537827,5.165935 +10X_cells.ATTTCTGGTGCACCAC-L8TX_180115_01_A09,5.282177,4.973918 +10X_cells.CCTTACGGTCGCTTTC-L8TX_180115_01_A09,5.0679893,4.1120114 +10X_cells.AGATCTGTCTCGGACG-L8TX_180115_01_C09,5.14139,5.11388 +10X_cells.ACATCAGGTGTGAATA-L8TX_180115_01_D09,6.417914,5.1253524 +10X_cells.ACGCCAGCATTGCGGC-L8TX_180115_01_D09,6.39176,3.5643308 +10X_cells.CTCATTAAGACAGAGA-L8TX_180115_01_D09,5.592773,5.079019 +10X_cells.ACGGCCATCCGGGTGT-L8TX_180115_01_D10,7.9975195,5.268065 +10X_cells.CATGGCGAGTGTTTGC-L8TX_180115_01_H10,7.4945993,5.7434464 +10X_cells.GTGAAGGCACATGACT-L8TX_180115_01_H10,6.09869,5.254264 +10X_cells.AATCGGTAGCCACGTC-L8TX_180115_01_B10,5.2917457,5.302553 +10X_cells.CGTCTACCAACTTGAC-L8TX_180115_01_B10,6.178382,4.111211 +10X_cells.TAGGCATCAGATCTGT-L8TX_180115_01_B11,11.336139,1.9505401 +10X_cells.TGTATTCCACAAGACG-L8TX_180115_01_B11,6.8889523,4.375788 +10X_cells.CAAGTTGGTGTCTGAT-L8TX_180115_01_C10,6.836855,4.9550457 +10X_cells.GCGACCACAAACGTGG-L8TX_180115_01_C11,6.7942715,4.3649054 +10X_cells.TGTGGTACACTCAGGC-L8TX_180115_01_C11,6.9551897,3.4978116 +10X_cells.CGATGGCTCATCACCC-L8TX_180115_01_D11,7.118837,4.7643065 +10X_cells.CTGCCTAGTGGAAAGA-L8TX_180115_01_D11,8.207759,4.738711 +10X_cells.CGATGGCAGTTACCCA-L8TX_180115_01_E10,5.3428655,4.241034 +10X_cells.GATCAGTGTAGATTAG-L8TX_180115_01_E10,4.931945,4.2306356 +10X_cells.CGTCTACCACAACGCC-L8TX_180115_01_F10,9.876363,5.844511 +10X_cells.GATGCTAGTCACACGC-L8TX_180115_01_F10,6.777007,4.9830165 +10X_cells.TCTTCGGCACGGCTAC-L8TX_180115_01_F10,5.0045123,4.2618437 +10X_cells.TTTGTCACAAGCTGAG-L8TX_180115_01_F10,7.636825,5.5274534 +10X_cells.AATCGGTGTTATCGGT-L8TX_180115_01_G10,7.910794,4.6538224 +10X_cells.CACACTCGTAAGAGAG-L8TX_180115_01_G10,5.9475026,5.2906656 +10X_cells.TCTCTAATCTACTCAT-L8TX_180115_01_G10,7.8231254,5.9112835 +10X_cells.CAGAATCTCTTACCTA-L8TX_180115_01_E11,6.64068,3.7844524 +10X_cells.CGATGGCAGTTAGCGG-L8TX_180115_01_E11,6.111265,5.187594 +10X_cells.TCAGGTACAGACAAAT-L8TX_180115_01_E11,6.127802,4.303971 +10X_cells.TGAAAGAAGGCACATG-L8TX_180115_01_E11,5.9490466,4.030614 +10X_cells.CACAGTACACGAAATA-L8TX_180115_01_F11,6.3155384,4.5052824 +10X_cells.CCGTACTGTCCTAGCG-L8TX_180115_01_G11,9.30812,5.2986016 +10X_cells.GGAGCAACAGACGCTC-L8TX_180115_01_H11,6.966225,4.7314405 +10X_cells.AGCGTATTCTTTAGTC-L8TX_180115_01_H09,7.719444,5.256902 +10X_cells.GACCTGGTCACAGTAC-L8TX_180115_01_H09,7.415808,4.241818 +10X_cells.TACCTTAGTCGAAAGC-L8TX_180115_01_H09,8.419175,5.738516 +10X_cells.AAGGCAGTCGGTCCGA-L8TX_180115_01_A10,6.4319997,4.1587157 +10X_cells.ACGAGCCTCAGAGACG-L8TX_180115_01_E09,6.214063,3.491545 +10X_cells.ATCATGGGTCCCTACT-L8TX_180115_01_E09,6.8738084,3.9635575 +10X_cells.GTTACAGCATCACAAC-L8TX_180115_01_E09,5.9326153,5.1148043 +10X_cells.TCACAAGTCGTAGATC-L8TX_180115_01_E09,7.7959876,5.3900056 +10X_cells.ACGATGTGTGAGGGTT-L8TX_180115_01_F09,6.1408687,5.172567 +Smartseq_cells.SM-GE5PC_S249_E1-50,6.7821627,4.33117 +10X_cells.ACACCGGCAATCTGCA-L8TX_171120_01_H07,5.5788083,4.890466 +10X_cells.TACACGAGTTCCTCCA-L8TX_171120_01_H07,6.3950458,3.0787377 +10X_cells.GGTGAAGAGATGCCTT-L8TX_171120_01_D07,5.7363715,4.6479425 +10X_cells.GAAACTCGTCTCACCT-L8TX_171120_01_E07,5.9065194,4.0219116 +10X_cells.TTAGTTCTCACCGTAA-L8TX_171120_01_E07,5.7566013,4.34104 +10X_cells.GCTGGGTAGATGTGGC-L8TX_171120_01_F07,5.8070984,4.3794646 +10X_cells.CCAATCCGTCTGATTG-L8TX_180115_01_C08,7.1103797,4.419389 +Smartseq_cells.LS-15500_S89_E1-50,5.880423,3.6098862 From fcf7b3c86c0ad1632a43680427b69981c7670076 Mon Sep 17 00:00:00 2001 From: cvanvelt Date: Wed, 30 Sep 2020 20:44:20 -0700 Subject: [PATCH 20/70] Update to plot_2d_umap_anno. Adding plotting options. --- R/reduceDimension_plot.R | 116 ++++++++++++++++++++++++++------------- 1 file changed, 77 insertions(+), 39 deletions(-) diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 1e82913..1139b40 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -83,7 +83,7 @@ plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alph else{ g = g + guides(colour = guide_legend(override.aes = list(shape = shape[levels(rd.dat$cl)],size = legend.size)),ncol=ncol) } - g = g + theme(legend.position="bottom") + g = g + theme(legend.position="right") } else{ g = g + theme(legend.position="none") @@ -479,38 +479,45 @@ plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missin - #' plot_2d_umap_anno #' #' @param umap.fn path to umap coordinates. CSV file containing sample_names and umap x/y coordinates #' @param anno.df Sample annotations. The first column should be sample_name, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. -#' @param meta.fields base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. #' @param dest.d path to save plots. -#' @param section_wedges Default is NULL. Use annotation to separate Can be used to generate lines between sections to divide leaves of dendrogram, e.g. separating subclass, class. +#' @param meta.fields base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. +#' @param show.label TRUE or FALSE. To show cluster label on top of plot. #' @param alpha level of transparency of dots. Value between 0 (fully transparent) and 1 (fully opaque) -#' - +#' @param cex size of plotted points. Default = 0.25 +#' @param save.format figures can be saved as "png", "pdf" or "both" +#' @param plot.height +#' @param plot.width +#' @param show.legend TRUE or FALSE. Whether to show legend with plot. +#' +#' #' @example_data: #' -#' load("data/plot_example/umap.csv") -#' load("data/plot_example/anno.df.rda") +#' load("data/rd_plot_example/example_umap.csv") +#' load("data/rd_plot_example/anno.df.rda") #' #' -#' @usage plots <- plot_2d_umap_anno(umap.fn="data/rd_plot_example/example_umap.csv",anno.df=anno.df, dest.d="./", meta.fields=c("platform","joint_region"),show.label=TRUE,alpha=0.5, cex=0.15,save.format="both") +#' @usage plots <- plot_2d_umap_anno(umap.fn="data/rd_plot_example/example_umap.csv",anno.df=anno.df, dest.d="./", meta.fields=c("platform","joint_region"),show.label=FALSE,alpha=0.5, cex=0.15,save.format="both", plot.height=7, plot.width=10, show.legend=TRUE) #' #' #' + plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./", meta.fields=NULL, - show.label=TRUE, + show.label=FALSE, alpha=0.65, cex=0.25, save.format=c("png","pdf","both"), - plot.size=7) + plot.height=7, + plot.width=7, + show.legend=FALSE) { library(data.table) library(dplyr) @@ -518,31 +525,43 @@ plot_2d_umap_anno <- function(umap.fn, #load umap from csv umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) - colnames(umap.df) = c("sample_name","Dim1","Dim2") - umap.df = umap.df[sample(1:nrow(umap.df)),] - umap.df = umap.df %>% left_join(anno.df) - umap.2d = umap.df[,c("Dim1","Dim2")] - row.names(umap.2d)=umap.df$sample_name - umap.2d = umap.2d[sample(1:nrow(umap.2d)),] + colnames(umap.df) <- c("sample_name","Dim1","Dim2") + umap.df <- umap.df[sample(1:nrow(umap.df)),] + umap.df <- umap.df %>% left_join(anno.df) + umap.2d <- umap.df[,c("Dim1","Dim2")] + row.names(umap.2d)<-umap.df$sample_name + umap.2d <- umap.2d[sample(1:nrow(umap.2d)),] # extract filename for saving - umap.fn = basename(umap.fn) + umap.fn <- basename(umap.fn) umap.fn <- gsub(".csv", "",umap.fn) #setup cluster labels/colors for plotting - cl = setNames(umap.df$cl, umap.df$sample_name) - cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique - cl.color = setNames(cl.df$cluster_color, cl.df$cl) - cl.label = setNames(cl.df$cluster_label, cl.df$cl) + cl <- setNames(umap.df$cl, umap.df$sample_name) + cl.df <- umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique + cl.color <- setNames(cl.df$cluster_color, cl.df$cl) + cl.label <- setNames(cl.df$cluster_label, cl.df$cl) plot.list <- list() #plot umap colored by cluster if(show.label==TRUE) { - g1= plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex) - plot.list$cluster <- g1 - - } else { - g1= plot_RD_cl(umap.2d, cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha,label.center=FALSE) - plot.list$cluster <- g1 + g <- plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex, show.legend = FALSE) + plot.list$cluster <- g + } + else { + if(show.legend==TRUE){ + print("legend") + g <- plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex,label.center=FALSE, show.legend = TRUE) + g[["labels"]][["colour"]] <- "Cluster" + legend <- cowplot::get_legend(g) + + g <- plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex,label.center=FALSE, show.legend = FALSE) + g <- cowplot::plot_grid(g, legend, ncol=2) + plot.list$cluster <- g + } + else{ + g <- plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex,label.center=FALSE, show.legend = FALSE) + plot.list$cluster <- g + } } if(!is.null(meta.fields)) { @@ -552,28 +571,48 @@ plot_2d_umap_anno <- function(umap.fn, colnames(tmp.df)=c("id","label","color") tmp.df = tmp.df %>% arrange(id) tmp.color = setNames(as.character(tmp.df$color), tmp.df$label) - g= plot_RD_meta(umap.2d, factor(umap.df[,paste0(m, "_label")], levels=names(tmp.color)),meta.col = tmp.color,alpha=alpha) - g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ - theme_void() + - theme(legend.position="none") + - coord_fixed(ratio=1) - plot.list[[m]] <- g + + g= plot_RD_meta(umap.2d, + factor(umap.df[,paste0(m, "_label")], + levels=names(tmp.color)), + meta.col = tmp.color, + alpha=alpha) + + if(show.legend==TRUE){ + print("legend") + g[["labels"]][["colour"]] <- m + legend <- cowplot::get_legend(g) + g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ + theme_void() + + theme(legend.position="none") + + coord_fixed(ratio=1) + g <- cowplot::plot_grid(g, legend, ncol=2) + plot.list[[m]] <- g + } + else{ + print("no leg") + g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ + theme_void() + + theme(legend.position="none") + + coord_fixed(ratio=1) + plot.list[[m]] <- g + } } } #save list of plots as pdf or png if(save.format == "pdf") { lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.size, width=plot.size )) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.height, width=plot.width )) } else if(save.format == "png"){ lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.size, width=plot.size )) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.height, width=plot.width )) } else if(save.format == "both"){ lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.size, width=plot.size )) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.height, width=plot.width )) lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.size, width=plot.size )) + ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.height, width=plot.width )) } else{ print("Specify save.format") } @@ -583,7 +622,6 @@ plot_2d_umap_anno <- function(umap.fn, - #dest.d = "Manuscript/common/umap_constellation/" #for(umap.fn in dir(dest.d, pattern="umap.2d.sampled.csv")){ # plot_2d_umap(umap.fn, dest.d) From 36ae64e73c079f5291c1f9626e056ae4a393c863 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 9 Oct 2020 09:28:51 -0700 Subject: [PATCH 21/70] change adjust_color function --- R/annotate.R | 18 +++++++------ R/markers.R | 56 ++++++++++++++++++++++++++++------------ R/reduceDimension_plot.R | 6 ++--- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/R/annotate.R b/R/annotate.R index 1a399a3..76f5209 100644 --- a/R/annotate.R +++ b/R/annotate.R @@ -518,21 +518,23 @@ adjust_color <- function(colorset) { duplicated_colors <- which(duplicated(colorset)) while(length(duplicated_colors) > 0) { - + print(length(duplicated_colors)) rgb <- col2rgb(colorset) for(x in duplicated_colors) { - - if(x < length(duplicated_colors)) { - tmp <- round(rgb[,x - 1] * 0.8 + sample(20, 3) + rgb[,x + 1] * 0.2) - } else{ - tmp <- round(rgb[,x - 1] * 0.8 + sample(40, 3)) - } - + print(x) + print(rgb[,x]) + i = sample(1:3,1) + bg = rep(0,3) + bg[i] = (20+ sample(30,1)) * sample(c(1,-1) , 1) + k = which(colorset== colorset[x])[1] + tmp <- round(rgb[,k] * 0.8 + bg) rgb[,x] <- tmp + print(rgb[,x]) } rgb[rgb > 255] <- 255 + rgb[rgb < 0] <- 0 colorset <- rgb(rgb[1,], rgb[2,], diff --git a/R/markers.R b/R/markers.R index 4de78b1..a64341f 100644 --- a/R/markers.R +++ b/R/markers.R @@ -258,7 +258,8 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up #' @export #' #' @examples -select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) +# Always directory +select_markers_pair_group_top<- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) { require(matrixStats) pairs = do.call("rbind",strsplit(names(de.genes), "_")) @@ -275,26 +276,47 @@ select_markers_pair_group <- function(cl, g1,g2,de.genes,cl.means, top.n=50,max. all.genes = row.names(up.gene.score) tmp.up.gene.score = cbind(up.gene.score[,up.pairs,drop=F], down.gene.score[,down.pairs,drop=F]) tmp.down.gene.score = cbind(down.gene.score[,up.pairs,drop=F], up.gene.score[,down.pairs,drop=F]) + tmp.up.gene.score.total = rowSums(tmp.up.gene.score) + tmp.down.gene.score.total = rowSums(tmp.down.gene.score) - up.genes = row.names(tmp.up.gene.score)[head(order(rowSums(tmp.up.gene.score), decreasing=T), n.markers)] - down.genes = row.names(tmp.down.gene.score)[head(order(rowSums(tmp.down.gene.score), decreasing=T), n.markers)] - - up.num = colSums(tmp.up.gene.score[up.genes,,drop=F] >0) - down.num = colSums(tmp.down.gene.score[down.genes,,drop=F] >0 ) - total.num = up.num + down.num - add.genes = setNames(rep(n.markers, ncol(tmp.up.gene.score)), colnames(tmp.up.gene.score)) - total.num - add.genes = add.genes[add.genes > 0] - - up.genes = up.genes[rowMins(as.matrix(tmp.up.gene.score[up.genes,,drop=F])) > 0 ] - down.genes = down.genes[rowMins(as.matrix(tmp.down.gene.score[down.genes,,drop=F])) > 0 ] + tmp.up.gene.score.total = sort(tmp.up.gene.score.total[tmp.up.gene.score.total>0],decreasing=TRUE) + tmp.down.gene.score.total = sort(tmp.down.gene.score.total[tmp.down.gene.score.total>0],decreasing=TRUE) + + up.genes = names(head(tmp.up.gene.score.total, n.markers)) + down.genes = names(head(tmp.down.gene.score.total,n.markers)) + + up.num = colSums(tmp.up.gene.score[up.genes, , drop = F] > 0) + down.num = colSums(tmp.down.gene.score[down.genes, , drop = F] > 0) genes = union(up.genes, down.genes) - if(length(add.genes)>0){ - tmp=select_markers_pair(add.genes= add.genes,de.genes= de.genes, gene.score=pmin(tmp.up.gene.score, tmp.down.gene.score), rm.genes=c(up.genes, down.genes),top.n=top.n) - genes=union(genes, unlist(tmp)) - } - return(list(up.genes=up.genes, down.genes=down.genes, genes=genes)) + select = !row.names(tmp.up.gene.score) %in% genes + tmp.up.gene.score = tmp.up.gene.score[select,,drop=F] + tmp.down.gene.score = tmp.down.gene.score[select,,drop=F] + + return(list(up.genes=up.genes, down.genes=down.genes, up.num=up.num, down.num=down.num, up.gene.score=tmp.up.gene.score, down.gene.score=tmp.down.gene.score, up.gene.score.total=tmp.up.gene.score.total, down.gene.score.total = tmp.down.gene.score.total)) } +select_markers_pair_group<- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=20,up.gene.score=NULL, down.gene.score=NULL) + { + result=select_markers_pair_group_top(cl, g1,g2,de.genes,cl.means, top.n=50,max.num=1000,n.markers=n.markers,up.gene.score, down.gene.score) + up.gene.score= result$up.gene.score + down.gene.score=result$down.gene.score + up.num = result$up.num + down.num = result$down.num + up.genes = result$up.genes + down.genes = result$down.genes + genes = c(up.genes, down.genes) + + add.up = setNames(rep(n.markers, length(up.num)),names(up.num)) - up.num + add.down = setNames(rep(n.markers, length(down.num)),names(down.num)) - up.num + + if(sum(add.up) + sum(add.down) > 0){ + tmp = select_markers_pair_direction(add.up,add.down,de.genes=de.genes, cl.means=cl.means,up.gene.score=up.gene.score,down.gene.score=down.gene.score) + genes = c(genes, tmp$markers) + } + return(list(genes=genes, up.genes=up.genes, down.genes=down.genes)) + } + + #' Title #' diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index abc1493..3193456 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -39,7 +39,7 @@ get_RD_cl_center <- function(rd.dat, cl) #' @export #' #' @examples -plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alpha.val=NULL,show.legend=FALSE, legend.size=2, label.center=TRUE, bg="blank",fn.color="black",no.shape=TRUE,ncol=4) +plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alpha.val=NULL,show.legend=FALSE, legend.size=2, label.center=TRUE, bg="blank",fn.color="black",no.shape=TRUE,ncol=4,shift.x=0, shift.y=0) { rd.dat=as.data.frame(rd.dat) colnames(rd.dat) = paste0("Dim", 1:ncol(rd.dat)) @@ -65,7 +65,7 @@ plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alph if(label.center){ g = g + geom_point(data=as.data.frame(cl.center), aes(x=x, y=y), size=cex*1.5) for(i in 1:nrow(cl.center)){ - g = g + annotate("text", label=cl.label[row.names(cl.center)[i]], x=cl.center[i,1], y=cl.center[i,2],size=fn.size,color=fn.color) + g = g + annotate("text", label=cl.label[row.names(cl.center)[i]], x=cl.center[i,1]+shift.x, y=cl.center[i,2] + shift.y,size=fn.size,color=fn.color) } } if(bg=="blank"){ @@ -486,12 +486,12 @@ plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./",meta.fields=c("platf library(dplyr) library(ggplot2) umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) + umap.df = umap.df[sample(1:nrow(umap.df)),] colnames(umap.df) = c("sample_name","Dim1","Dim2") umap.df = umap.df[sample(1:nrow(umap.df)),] umap.df = umap.df %>% left_join(anno.df) umap.2d = umap.df[,c("Dim1","Dim2")] row.names(umap.2d)=umap.df$sample_name - umap.2d = umap.2d[sample(1:nrow(umap.2d)),] umap.fn = basename(umap.fn) cl = setNames(umap.df$cl, umap.df$sample_name) cl.df = umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique From 7b20933ff876d3fa24a83357b1e665e1a7636e41 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Thu, 3 Dec 2020 21:18:21 -0500 Subject: [PATCH 22/70] add parallel mode for select_pos_markers --- R/KNN.graph.R | 28 +++++++++++++++---- R/markers.R | 58 +++++++++++++++++----------------------- R/reduceDimension_plot.R | 29 ++++++++++---------- 3 files changed, 62 insertions(+), 53 deletions(-) diff --git a/R/KNN.graph.R b/R/KNN.graph.R index d54c9f5..f72fe91 100644 --- a/R/KNN.graph.R +++ b/R/KNN.graph.R @@ -10,10 +10,12 @@ #' @export #' #' @examples -get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0.5,clean.cells=row.names(rd.dat)) +get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0.5,clean.cells=row.names(rd.dat), knn.result=NULL) { - knn.result = RANN::nn2(rd.dat,k=k) - row.names(knn.result[[1]]) = row.names(knn.result[[2]])=row.names(rd.dat) + if(is.null(knn.result)){ + knn.result = RANN::nn2(rd.dat,k=k) + row.names(knn.result[[1]]) = row.names(knn.result[[2]])=row.names(rd.dat) + } knn = knn.result[[1]] knn.dist = knn.result[[2]] knn.cl = matrix(cl[row.names(knn)[knn]],ncol=ncol(knn)) @@ -84,7 +86,7 @@ get_knn_graph <- function(rd.dat, cl, k=15, knn.outlier.th=2, outlier.frac.th=0. #' @usage plotting.MGE.constellation <- plot_constellation(knn.cl.df = knn.cl.df, cl.center.df = cl.center.df, out.dir = "data/Constellation_example/plot", node.dodge=TRUE, plot.hull=c(1,2)) -plot_constellation <- function(knn.cl.df, cl.center.df, out.dir, node.label="cluster_id", exxageration=2, curved = TRUE, plot.parts=FALSE, plot.hull = NULL, plot.height=25, plot.width=25, node.dodge=FALSE, label.size=2, max_size=10) { +plot_constellation <- function(knn.cl.df, cl.center.df, out.dir, node.label="cluster_id", exxageration=2, curved = TRUE, plot.parts=FALSE, plot.hull = NULL, plot.height=25, plot.width=25, node.dodge=FALSE, label.size=2, max_size=10, size.breaks = c(100,1000,10000,100000)) { library(gridExtra) library(sna) @@ -121,7 +123,7 @@ plot_constellation <- function(knn.cl.df, cl.center.df, out.dir, node.label="clu color=alpha(cluster_color, 0.8))) + scale_size_area(trans="sqrt", max_size=max_size, - breaks = c(100,1000,10000,100000)) + + breaks = size.breaks) + scale_color_identity() + geom_text(data=cl.center.df, aes(x=x, @@ -723,3 +725,19 @@ angle <- function(x, y) { atan2(y[2] - y[1], x[2] - x[1]) } + + +plot_umap_constellation <- function(umap.2d, cl, cl.df, select.knn.cl.df, dest.d=".", prefix="",...) + { + + cl.center.df = as.data.frame(get_RD_cl_center(umap.2d,cl)) + cl.center.df$cl = row.names(cl.center.df) + cl.center.df$cluster_id <- cl.df$cluster_id[match(cl.center.df$cl, cl.df$cl)] + cl.center.df$cluster_color <- cl.df$cluster_color[match(cl.center.df$cl, cl.df$cl)] + cl.center.df$cluster_label <- cl.df$cluster_label[match(cl.center.df$cl, cl.df$cl)] + cl.center.df$cluster_size <- cl.df$cluster_size[match(cl.center.df$cl, cl.df$cl)] + tmp.cl = row.names(cl.center.df) + tmp.knn.cl.df = select.knn.cl.df %>% filter(cl.from %in% tmp.cl & cl.to %in% tmp.cl) + p=plot_constellation(tmp.knn.cl.df, cl.center.df, node.label="cluster_id", out.dir=file.path(dest.d,prefix),...) + } + diff --git a/R/markers.R b/R/markers.R index a64341f..d5aa860 100644 --- a/R/markers.R +++ b/R/markers.R @@ -276,8 +276,8 @@ select_markers_pair_group_top<- function(cl, g1,g2,de.genes,cl.means, top.n=50,m all.genes = row.names(up.gene.score) tmp.up.gene.score = cbind(up.gene.score[,up.pairs,drop=F], down.gene.score[,down.pairs,drop=F]) tmp.down.gene.score = cbind(down.gene.score[,up.pairs,drop=F], up.gene.score[,down.pairs,drop=F]) - tmp.up.gene.score.total = rowSums(tmp.up.gene.score) - tmp.down.gene.score.total = rowSums(tmp.down.gene.score) + tmp.up.gene.score.total = Matrix::rowSums(tmp.up.gene.score) + tmp.down.gene.score.total = Matrix::rowSums(tmp.down.gene.score) tmp.up.gene.score.total = sort(tmp.up.gene.score.total[tmp.up.gene.score.total>0],decreasing=TRUE) tmp.down.gene.score.total = sort(tmp.down.gene.score.total[tmp.down.gene.score.total>0],decreasing=TRUE) @@ -390,37 +390,25 @@ select_pos_markers <- function(de.genes, cl, cl.means=NULL, n.markers=3, default up.gene.score=tmp$up.gene.score down.gene.score=tmp$down.gene.score } - cl.df$markers="" - if (mc.cores == 1) { - registerDoSEQ() - } - else { - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } - ###for each cluster, find markers that discriminate it from other types - cl.markers <- parallel::pvec(levels(cl), function(x){ - sapply(x, function(tmp.cl){ - cat("Cl\n",tmp.cl,"\n") - up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] - down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] - add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) - add.down = setNames(rep(n.markers, length(down.pairs)), down.pairs) - - up.default = sapply(up.pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) - down.default = sapply(down.pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) - if(length(up.default)>0){ - add.up = pmax(add.up - sapply(up.default, length),0) - } - if(length(down.default)>0){ - add.down = pmax(add.down - sapply(down.default, length),0) - } - tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, cl.means=cl.means, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) - unique(c(tmp.result$markers, unlist(up.default), unlist(down.default))) - },simplify=F) - },mc.cores=mc.cores) + cl.markers <- parallel::mclapply(levels(cl), function(x){ + up.pairs = row.names(pairs.df)[pairs.df[,1] == x] + down.pairs = row.names(pairs.df)[pairs.df[,2] == x] + add.up = setNames(rep(n.markers, length(up.pairs)), up.pairs) + add.down = setNames(rep(n.markers, length(down.pairs)), down.pairs) + + up.default = sapply(up.pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) + down.default = sapply(down.pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) + if(length(add.up) > 0 & length(up.default)>0){ + add.up = pmax(add.up - sapply(up.default, length),0) + } + if(length(add.down) > 0 & length(down.default)>0){ + add.down = pmax(add.down - sapply(down.default, length),0) + } + tmp.result = select_markers_pair_direction(add.up=add.up, add.down=add.down,de.genes=de.genes, cl.means=cl.means, up.gene.score=up.gene.score,down.gene.score=down.gene.score,rm.genes=c(rm.genes,default.markers)) + unique(c(tmp.result$markers, unlist(up.default), unlist(down.default))) + }, mc.cores=mc.cores) + names(cl.markers) = levels(cl) return(cl.markers) } @@ -442,12 +430,14 @@ select_top_pos_markers <- function(de.genes, cl, n.markers=3, up.gene.score, dow ###for each cluster, find markers that discriminate it from other types cl.markers <- parallel::pvec(levels(cl), function(x){ sapply(x, function(tmp.cl){ - print(tmp.cl) up.pairs = row.names(pairs.df)[pairs.df[,1] == tmp.cl] down.pairs = row.names(pairs.df)[pairs.df[,2] == tmp.cl] - if(length(up.pairs)){ + if(length(up.pairs)>0){ sc = get_row_sums(up.gene.score, select.col=up.pairs) } + else{ + sc = 0 + } if(length(down.pairs)>0){ sc = sc+ get_row_sums(down.gene.score, select.col=down.pairs) } diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index fc84d3c..01620f9 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -507,6 +507,7 @@ plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missin plot_2d_umap_anno <- function(umap.fn, anno.df, dest.d="./", + umap.2d = NULL, meta.fields=NULL, show.label=FALSE, alpha=0.65, @@ -519,15 +520,16 @@ plot_2d_umap_anno <- function(umap.fn, library(data.table) library(dplyr) library(ggplot2) - + if(is.null(umap.2d)){ #load umap from csv - umap.df <- as.data.frame(fread(umap.fn,header=TRUE)) - colnames(umap.df) <- c("sample_name","Dim1","Dim2") - umap.df <- umap.df[sample(1:nrow(umap.df)),] - umap.df <- umap.df %>% left_join(anno.df) - umap.2d <- umap.df[,c("Dim1","Dim2")] - row.names(umap.2d)<-umap.df$sample_name - umap.2d <- umap.2d[sample(1:nrow(umap.2d)),] + umap.2d <- as.data.frame(fread(umap.fn,header=TRUE)) + colnames(umap.2d) <- c("sample_name","Dim1","Dim2") + umap.2d <- umap.2d[sample(1:nrow(umap.2d)),] + } + umap.df = umap.2d %>% left_join(anno.df) + row.names(umap.2d)<-umap.2d$sample_name + umap.2d <- umap.2d[,c("Dim1","Dim2")] + # extract filename for saving umap.fn <- basename(umap.fn) umap.fn <- gsub(".csv", "",umap.fn) @@ -599,21 +601,20 @@ plot_2d_umap_anno <- function(umap.fn, #save list of plots as pdf or png if(save.format == "pdf") { lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.height, width=plot.width )) + ggsave(plot=plot.list[[nm]], file=file.path(dest.d, paste0(umap.fn,"_",nm, ".pdf")), useDingbats=FALSE, height=plot.height, width=plot.width )) } else if(save.format == "png"){ lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.height, width=plot.width )) + ggsave(plot=plot.list[[nm]], file=file.path(dest.d, paste0(umap.fn,"_",nm, ".png")), height=plot.height, width=plot.width )) } else if(save.format == "both"){ lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".pdf"), useDingbats=FALSE, height=plot.height, width=plot.width )) + ggsave(plot=plot.list[[nm]], file=file.path(dest.d, paste0(umap.fn,"_",nm, ".pdf")), useDingbats=FALSE, height=plot.height, width=plot.width )) lapply(names(plot.list), function(nm) - ggsave(plot=plot.list[[nm]], file=paste0(umap.fn,"_",nm, ".png"), height=plot.height, width=plot.width )) + ggsave(plot=plot.list[[nm]], file=file.path(dest.d, paste0(umap.fn,"_",nm, ".png")), height=plot.height, width=plot.width )) } else{ print("Specify save.format") } - - return(plot.list) + return(list(umap.2d=umap.2d, plot.list=plot.list)) } From 51c6a3078aaa54fbc3e968d770b41522b5f8eda5 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 26 Jan 2021 15:14:22 -0500 Subject: [PATCH 23/70] Fix namespace issue --- R/markers.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/markers.R b/R/markers.R index d5aa860..9644d36 100644 --- a/R/markers.R +++ b/R/markers.R @@ -285,8 +285,8 @@ select_markers_pair_group_top<- function(cl, g1,g2,de.genes,cl.means, top.n=50,m up.genes = names(head(tmp.up.gene.score.total, n.markers)) down.genes = names(head(tmp.down.gene.score.total,n.markers)) - up.num = colSums(tmp.up.gene.score[up.genes, , drop = F] > 0) - down.num = colSums(tmp.down.gene.score[down.genes, , drop = F] > 0) + up.num = Matrix::colSums(tmp.up.gene.score[up.genes, , drop = F] > 0) + down.num = Matrix::colSums(tmp.down.gene.score[down.genes, , drop = F] > 0) genes = union(up.genes, down.genes) select = !row.names(tmp.up.gene.score) %in% genes tmp.up.gene.score = tmp.up.gene.score[select,,drop=F] From f808d00205ac9a46d34ab42ff33e2b557d55f6f1 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 3 Feb 2021 19:55:17 -0500 Subject: [PATCH 24/70] Use loessFit from limma for loess fitting --- R/dendro.R | 12 ++++++++++++ R/vg.R | 9 ++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/R/dendro.R b/R/dendro.R index 017f699..07dd2b4 100644 --- a/R/dendro.R +++ b/R/dendro.R @@ -346,6 +346,18 @@ label_dend <- function(dend,n=1) } +reset_dend_label <- function(dend) + { + if(length(dend)>1){ + attr(dend, "label") = NULL + for(i in 1:length(dend)){ + dend[[i]] = reset_dend_label(dend[[i]]) + } + } + return(dend) + } + + #' Get dendrogram parent #' #' @param dend diff --git a/R/vg.R b/R/vg.R index d706db9..61c6a0b 100644 --- a/R/vg.R +++ b/R/vg.R @@ -249,8 +249,7 @@ gene_vars <- function(dat, means <- gene_means(dat) } - squared_dat <- dat^2 - + squared_dat <- dat^2 if(is.matrix(dat)) { rowMeans(squared_dat) - means ^ 2 } else { @@ -356,8 +355,8 @@ gene_loess_fit <- function(dat, selected_dispersions <- dispersions[select] selected_means <- means[select] - fit <- loess(selected_dispersions ~ log10(selected_means)) - + fit <- limma::loessFit(selected_dispersions, log10(selected_means)) + fit$x = as.matrix(log10(selected_means)) return(fit) } @@ -377,7 +376,7 @@ gene_loess_fit_z <- function(loess_fit, select <- !is.na(dispersions) & dispersions > 0 residual <- resid(loess_fit) - base <- min(predict(loess_fit)) + base <- min(loess_fit$fitted) diff <- dispersions - base diff[select] <- residual From 3e2aa55c017265506eff0cf96576640428293756 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 12 Feb 2021 14:25:27 -0500 Subject: [PATCH 25/70] Add merging step to each bootstrapping iteration in consensus cluster --- R/consensusCluster.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 4abe057..d360efc 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -522,6 +522,7 @@ run_consensus_clust <- function(norm.dat, require(parallel) prefix = paste("iter",i,sep=".") print(prefix) + library(Matrix) outfile= file.path(output_dir, paste0("result.",i,".rda")) if(file.exists(outfile)& !override){ return(NULL) @@ -530,6 +531,7 @@ run_consensus_clust <- function(norm.dat, save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) + result=scrattch.hicat::merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) save(result, file=outfile) } if(is.null(co.result)){ From 8383187b387cac5950f4e1d29a0d9f7105be1225 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 15 Feb 2021 17:07:58 -0800 Subject: [PATCH 26/70] Add imputation function implemented using Rcpp --- DESCRIPTION | 15 ++-- R/consensusCluster.R | 4 +- R/harmonize.R | 20 +++-- R/harmonize_impute.R | 107 ++++++++++++++++++++++++--- R/harmonize_merge.R | 26 +++++-- R/harmonize_util.R | 2 +- R/markers.R | 24 +++++- R/merge_cl.R | 10 +++ R/reduceDimension_PCA.R | 40 +++------- R/reduceDimension_Umap.R | 154 ++++++++++++++++++++++++--------------- R/reduceDimension_plot.R | 12 +-- src/impute.cpp | 74 +++++++++++++++++++ 12 files changed, 360 insertions(+), 128 deletions(-) create mode 100644 src/impute.cpp diff --git a/DESCRIPTION b/DESCRIPTION index fe97222..4731816 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,14 +1,13 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data Version: 1.0.1 -Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), +Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut","cre")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), person("Cindy", "van Velthoven", email = "cindy.vanvelthoven@alleninstitute.org", role = c("aut")), person("Jeremy", "Miller", email = "jeremym@alleninstitute.org", role = c("aut")), person("Adriana","Sedeno-Cortes", email ="adrianas@alleninstitute.org", role = c("aut")), person("Changkyu","Lee", email="Changkyul@alleninstitute.org", role = c("aut")), - person("Lawrence","Huang", email="lawrenceh@alleninstitute.org", role = c("aut")), person("Saroja","Somasundaram", email="sarojas@alleninstitute.org", role = c("aut"))) Description: Iteractive clustering of single cell RNASeq dataset. BugReports: https://github.com/AllenInstitute/scrattch.hicat/issues @@ -18,25 +17,25 @@ Encoding: UTF-8 LazyData: TRUE VignetteBuilder: knitr RoxygenNote: 7.0.2 -Requires: Matrix +Requires: Matrix,Rphenograph, Imports: + Rcpp, + RcppAnnoy, data.table, dendextend, - devtools, doParallel, + foreach, dplyr, - foreach, ggplot2, grid, Matrix, matrixStats, pvclust, - qlcMatrix, Rtsne +LinkingTo: Rcpp (>= 0.11.0) Suggests: WGCNA, knitr, rmarkdown, - testthat, - Rphenograph, + testthat, covr diff --git a/R/consensusCluster.R b/R/consensusCluster.R index d360efc..47c020e 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -531,7 +531,7 @@ run_consensus_clust <- function(norm.dat, save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) - result=scrattch.hicat::merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) + result=merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param) save(result, file=outfile) } if(is.null(co.result)){ @@ -546,7 +546,7 @@ run_consensus_clust <- function(norm.dat, cl <- parallel::makeCluster(mc.cores) doParallel::registerDoParallel(cl) - foreach::foreach(i=1:niter, .combine='c') %dopar% { run(i) } + foreach::foreach(i=1:niter,.packages=c("scrattch.hicat","Matrix"), .combine='c') %dopar% { run(i) } parallel::stopCluster(cl) } result.files=file.path(output_dir, dir(output_dir, "result.*.rda")) diff --git a/R/harmonize.R b/R/harmonize.R index c8390e3..db5a447 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -178,15 +178,20 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) #' @export #' #' @examples -get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1) +get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1,...) { results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine="rbind", FUN=function(x){ - get_knn(dat=dat[,x], ref.dat=ref.dat, k=k, method=method, dim=dim) + get_knn(dat=dat[,x], ref.dat=ref.dat, k=k, method=method, dim=dim,...) }) return(results) } +build_AnnoyTree <- function(ref.dat) + { + + } + #' Get KNN #' #' @param dat @@ -199,19 +204,20 @@ get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, m #' @export #' #' @examples -get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL) +get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,BINDEX=NULL, BNPARAM=NULL,...) { print(method) if(method=="cor"){ knn.index = knn_cor(ref.dat, dat,k=k) } - else if(method=="cosine"){ - knn.index = knn_cosine(ref.dat, dat,k=k) - } else if(method=="RANN"){ knn.index = RANN::nn2(t(ref.dat), t(dat), k=k)[[1]] } + else if(method=="Annoy"){ + library(BiocNeighbors) + knn.result = queryKNN(t(red.dat), t(dat),k=k, BINDEX=BINDEX, BNPARAM= BNPARAM)[[1]] + } else if(method == "CCA"){ mat3 = crossprod(ref.dat, dat) cca.svd <- irlba(mat3, dim=dim) @@ -472,6 +478,8 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= result$markers = select.genes result$select.genes= select.genes result$ref.de.param.list = ref.de.param.list + rm(merge.dat.list) + gc() return(result) }) } diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 90c3f07..2d8d956 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -83,15 +83,48 @@ predict_knn <- function(knn.idx, reference, cl, ...) #' @export #' #' @examples -impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores=1,transpose=FALSE,th=NULL,sparse=FALSE,batch.size=100000,combine=TRUE,...) +impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose_input=FALSE, transpose_output= FALSE) + { + cell.id = 1:nrow(knn.idx) + if(transpose_input){ + reference.id = match(reference, row.names(dat)) + genes = colnames(dat) + } + else{ + reference.id = match(reference, colnames(dat)) + genes=row.names(dat) + } + + if(transpose_output){ + impute.dat = matrix(0,length(cell.id), length(genes)) + row.names(impute.dat) = row.names(knn.idx) + colnames(impute.dat) = genes + } + else{ + impute.dat = matrix(0, length(genes),length(cell.id)) + row.names(impute.dat) = genes + colnames(impute.dat) = row.names(knn.idx) + } + ImputeKnn(knn.idx,cell.id, reference.id, dat, gene_idx_=NULL, w_mat_= w, impute.dat, transpose_input=transpose_input, transpose_output=transpose_output) + impute.dat +} + +impute_knn_old <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores=1,transpose=FALSE,th=NULL,sparse=FALSE,batch.size=100000,combine=TRUE,...) { require(doParallel) query = row.names(knn.idx) if(is.null(w)){ if(!is.null(knn.dist)){ w = get_knn_weight(knn.dist,...) + w = w/rowSums(w,na.rm=TRUE) + } + else{ + w = 1/ncol(knn.idx) } } + else{ + w = w/rowSums(w,na.rm=TRUE) + } if(nrow(knn.idx) < batch.size){ mc.cores=1 } @@ -108,25 +141,21 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores= impute.dat = foreach(j=1:length(bins),.combine="c") %dopar% { x = bins[[j]] impute.dat <- matrix(0, nrow=length(x),ncol=ncol(dat)) - total.w <- rep(0, length(x)) for(i in 1:ncol(knn.idx)){ #cat("bin", x[1],i, "\n") nn = reference[knn.idx[x,i]] select = nn %in% row.names(dat) tmp.dat = dat[nn[select],] -###Ignore the neighbors not present in imputation reference - if(!is.null(w)){ + ###Ignore the neighbors not present in imputation reference + if(length(w)>1){ impute.dat[select,] <<- impute.dat[select,] + tmp.dat* w[select, i] - total.w[select] = total.w[select]+ w[select,i] } else{ - impute.dat[select,]= impute.dat[select,] + tmp.dat - total.w[select] = total.w[select]+ 1 + impute.dat[select,] <<- impute.dat[select,] + tmp.dat* w } rm(tmp.dat) gc() } - impute.dat = impute.dat / total.w row.names(impute.dat) = row.names(knn.idx)[x] colnames(impute.dat) = colnames(dat) if(!is.null(th)){ @@ -206,7 +235,7 @@ iter_impute_knn <- function(knn, ref, dat, tol=10^-3,max.iter=100,...) #' @export #' #' @examples -impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) +impute_knn_global_old <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) { library(matrixStats) org.rd.dat.list <- list() @@ -283,6 +312,66 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell +impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) + { + library(matrixStats) + org.rd.dat.list <- list() + knn.list <- list() + impute.dat.list <- list() + ###Impute the reference dataset in the original space globally + for(x in names(ref.list)) + { + print(x) + tmp.cells= select.cells[comb.dat$meta.df[select.cells,"platform"]==x] + ref.cells = ref.list[[x]] + rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th, method=method,mc.cores=mc.cores,verbose=verbose) + org.rd.dat.list[[x]] = rd.result + rd.result = org.rd.dat.list[[x]] + if(!is.null(rm.eigen)){ + rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th,verbose=verbose) + } + print(ncol(rd.dat)) + + knn = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k)[[1]] + row.names(knn) = row.names(rd.dat) + impute.dat.list[[x]] = impute_knn(knn, ref.cells, as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells])) + } + + ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. + impute.genes=NULL + for(x in names(split.results)){ + print(x) + result = split.results[[x]] + cl = result$cl + knn = result$knn + for(ref.set in intersect(names(result$ref.list),names(ref.list))){ + print(ref.set) + tmp.cells = row.names(knn) + add.cells=FALSE + query.cells = intersect(tmp.cells[comb.dat$meta.df[tmp.cells,"platform"] != ref.set], select.cells) + if(is.null(impute.genes)){ + impute.genes = select.genes + } + else{ + impute.genes=intersect(select.genes,c(result$markers, result$select.genes)) + } + select.cols = comb.dat$meta.df[comb.dat$all.cells[knn[1,]],"platform"] == ref.set + cat("Impute genes", length(impute.genes),"\n") + if(sum(select.cols)==0){ + next + } + ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) + select.knn = knn[query.cells,select.cols] + gene.id = match(impute.genes, row.names(impute.dat.list[[ref.set]])) + cell.id = 1:nrow(select.knn) + reference.id = match(comb.dat$all.cells, colnames(impute.dat.list[[ref.set]])) + ImputeKnn(select.knn,cell.id, reference.id, dat=impute.dat.list[[ref.set]], gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[ref.set]], transpose_input=FALSE, transpose_output=FALSE) + } + } + return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) + } + + fast_knn <- function(query.dat, ref.dat=query.dat, distance="euclidean", k=15, M=16, ef=200,method="euclidean") { library("RcppHNSW") diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 01b1bca..0806fe7 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -2,6 +2,7 @@ #' #' @param dat.list #' @param de.param.list +#' @param common.genes #' @param cl #' @param pairs #' @param cl.means.list @@ -14,9 +15,15 @@ #' @export #' #' @examples -de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means.list=NULL, cl.present.list=NULL, cl.sqr.means.list=NULL, lfc.conservation.th=0.6, de.genes.list=NULL, max.cl.size=200, method="fast_limma") +de_genes_pairs_multiple <- function(dat.list, de.param.list, common.genes=NULL, cl, pairs, cl.means.list=NULL, cl.present.list=NULL, cl.sqr.means.list=NULL, lfc.conservation.th=0.6, de.genes.list=NULL, max.cl.size=200, method="fast_limma") { - cl.size = table(cl) + if(is.null(common.genes)){ + common.genes = row.names(dat.list[[1]]) + for(x in 2:length(dat.list)){ + common.genes= intersect(common.genes, row.names(dat.list[[x]])) + } + } + cl.size = table(cl) if(is.null(de.genes.list)){ de.genes.list = sapply(names(dat.list), function(x)list()) } @@ -48,7 +55,7 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means for(p in row.names(pairs)){ lfc = sapply(names(cl.means.list), function(x){ if(pairs[p,1] %in% colnames(cl.means.list[[x]]) & pairs[p,2] %in% colnames(cl.means.list[[x]])){ - cl.means.list[[x]][comb.dat$common.genes,pairs[p,1]] - cl.means.list[[x]][comb.dat$common.genes,pairs[p,2]] + cl.means.list[[x]][common.genes,pairs[p,1]] - cl.means.list[[x]][common.genes,pairs[p,2]] } else{ NULL @@ -61,7 +68,7 @@ de_genes_pairs_multiple <- function(dat.list, de.param.list, cl, pairs, cl.means if(is.null(lfc)){ return(NULL) } - row.names(lfc) = comb.dat$common.genes + row.names(lfc) = common.genes sign1 = rowSums(lfc > 1) sign2 = rowSums(lfc < -1) frac = pmax(sign1, sign2)/ncol(lfc) @@ -168,6 +175,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo { print("merge_cl_multiple") cl = setNames(as.character(cl),names(cl)) + merge_x_y <- function(x, y) { cat("merge", x, y, "\n") @@ -262,12 +270,12 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo return(list(cl=cl, cl.rd.list=cl.rd.list, cl.sim = cl.sim, cl.means.list=cl.means.list, cl.present.list = cl.present.list)) } - add_pairs_de_genes <- function(de.genes.list, cl, new.pairs) + add_pairs_de_genes <- function(de.genes.list, cl, new.pairs, common.genes) { if(verbose){ print("Add de genes") } - de.genes.list <- de_genes_pairs_multiple(merge.dat.list, merge.de.param.list, cl, pairs=new.pairs, cl.means.list=cl.means.list, cl.present.list=cl.present.list, cl.sqr.means.list= cl.sqr.means.list,lfc.conservation.th=lfc.conservation.th, de.genes.list=de.genes.list,method=de.method) + de.genes.list <- de_genes_pairs_multiple(merge.dat.list, merge.de.param.list, common.genes=common.genes, cl=cl, pairs=new.pairs, cl.means.list=cl.means.list, cl.present.list=cl.present.list, cl.sqr.means.list= cl.sqr.means.list,lfc.conservation.th=lfc.conservation.th, de.genes.list=de.genes.list,method=de.method) if(verbose){ print("Finish adding de genes") } @@ -323,6 +331,8 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo pairs=NULL ###Merge small clusters first cl.sim = get_cl_sim_multiple(cl.rd.list) + if (length(cl.sim)==0) return(NULL) + while(length(cl.small)>0){ knn = data.frame(cl=cl.small, nn=cl.big[sim_knn(cl.sim[cl.small, cl.big,drop=F],k=1)],stringsAsFactors=FALSE) knn$sim = get_pair_matrix(cl.sim, knn$cl, knn$nn) @@ -345,7 +355,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.small = cl.small[cl.small!=x] } merge.de.param.list = comb.dat$de.param.list[merge.sets] - + common.genes = comb.dat$common.genes cl.means.list = get_cl_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) cl.means.list = sapply(cl.means.list, as.data.frame, simplify=F) @@ -382,7 +392,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo }else{ de.pairs = rbind(merge.pairs[new.pairs,],de.pairs) } - de.genes.list = add_pairs_de_genes(de.genes.list, cl, merge.pairs[new.pairs,]) + de.genes.list = add_pairs_de_genes(de.genes.list, cl, merge.pairs[new.pairs,], common.genes) if(is.null(de.genes.list) || sum(sapply(de.genes.list, length))==0){ return(NULL) } diff --git a/R/harmonize_util.R b/R/harmonize_util.R index 9a2cd7b..cdbeb45 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -381,7 +381,7 @@ comb_de_result <- function(de.genes.list, cl.means.list, common.genes=NULL, max. de.counts = table(unlist(lapply(names(de.genes.list), function(set){ de = de.genes.list[[set]][[p]] c(names(de$up.genes),names(de$down.genes))}))) - g = intersect(names(de.counts), comb.dat$common.genes) + g = intersect(names(de.counts), common.genes) pair = unlist(strsplit(p,"_")) lfc = lapply(sets, function(set){ cl.means = cl.means.list[[set]] diff --git a/R/markers.R b/R/markers.R index 9644d36..c81be59 100644 --- a/R/markers.R +++ b/R/markers.R @@ -338,6 +338,7 @@ select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.s { add.up = setNames(rep(add.up, length(pairs)), pairs) add.down= setNames(rep(add.down, length(pairs)), pairs) + up.default = down.default = c() if(!is.null(default.markers)){ up.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) down.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) @@ -603,7 +604,6 @@ within_group_specific_markers <- function(cl.g, norm.dat, cl, ...) ###Beta score from Trygve - #' Title #' #' @param propExpr @@ -638,3 +638,25 @@ get_beta_score <- function(propExpr, spec.exp = 2, mcores=1){ } + +###select_markers_groups +#' Title +#' +#' @param de.genes +#' @param cl.group Assignment of clusters to groups cluster as names, and group id as values. +#' +#' @return +#' @export +#' +#' @examples + + +select_markers_groups <- function(de.genes, cl.group, cl.means, n.markers=1,...) + { + pairs = create_pairs(as.character(names(cl.group))) + pairs = pairs[cl.group[pairs[,1]]!= cl.group[pairs[,2]], ] + markers=select_N_markers(de.genes, cl.means=cl.means, pairs=row.names(pairs), ...) + return(markers) + } + + diff --git a/R/merge_cl.R b/R/merge_cl.R index ed7b60e..16a95e7 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -76,6 +76,7 @@ merge_cl<- function(norm.dat, pairs=do.call("rbind",strsplit(names(de.genes), "_")) row.names(pairs)=names(de.genes) } + print("get cl.rd") ###Merge small clusters with the closest neighbors first. if(!is.null(rd.dat)){ cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) @@ -240,3 +241,12 @@ merge_cl<- function(norm.dat, return(list(cl=cl, de.genes=de.genes,sc=sc, markers=markers)) } + + +iter_clust_merge <- function(norm.dat, select.cells, merge.type="undirectional", de.param = de_param(), max.cl.size = 300,...) +{ + result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells, de.param = de.param, merge.type=merge.type, ...) + result=merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) + return(result) +} + diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index ac61970..304d5e3 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -1,29 +1,4 @@ - #' prcomp irlba -#' -#' @param x -#' @param max.rank -#' @param maxit -#' @param tol -#' @param center -#' @param ... -#' -#' @return -#' @export -#' -#' @examples -prcomp.irlba <- function(x, max.rank=500, maxit=1000, tol=1e-05, center=TRUE,...) - { - library(irlba) - s <- irlba::irlba(x, nv=max.rank, nu=max.rank, maxit = maxit, tol=tol, ...) - s$d <- s$d / sqrt(max(1, nrow(x) - 1)) - dimnames(s$v) <- list(colnames(x), paste0("PC", seq_len(ncol(s$v)))) - r <- list(sdev = s$d, rotation = s$v) - r$x <- x %*% s$v - class(r) <- "prcomp" - r - } - #' Title #' @@ -66,12 +41,21 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln return(list(rd.dat=rd.dat, pca=pca)) } -get_PCA <- function(dat, max.pca, verbose=FALSE, method="zscore",th=2) +get_PCA <- function(dat, max.pca, verbose=FALSE, method="zscore",th=2,fun="prcomp", rot=TRUE, init.pca = 200) { library(Matrix) library(stats) - - pca = stats::prcomp(t(as.matrix(dat)),tol=0.01) + if(rot){ + dat = t(dat) + } + dat = as.matrix(dat) + if(fun=="prcomp"){ + pca = stats::prcomp(dat,tol=0.01) + } + else{ + require("irlba") + pca = prcomp_irlba(dat, n = min(init.pca, nrow(dat))); + } if(method=="elbow"){ dim.elbow = findElbowPoint(pca$sdev^2) if(verbose){ diff --git a/R/reduceDimension_Umap.R b/R/reduceDimension_Umap.R index 9a60c29..e331355 100644 --- a/R/reduceDimension_Umap.R +++ b/R/reduceDimension_Umap.R @@ -1,62 +1,98 @@ -#' Adapt from Seurat package -#' @importFrom reticulate py_module_available py_set_seed import -#' -#' @rdname RunUMAP -#' @method RunUMAP default -#' @export -#' -rd_Umap <- function( - mat, - n.neighbors = 30L, - n.components = 2L, - metric = "correlation", - n.epochs = NULL, - learning.rate = 1.0, - min.dist = 0.3, - spread = 1.0, - set.op.mix.ratio = 1.0, - local.connectivity = 1L, - repulsion.strength = 1, - negative.sample.rate = 5, - a = NULL, - b = NULL, - seed.use = 42, - metric.kwds = NULL, - angular.rp.forest = FALSE, - reduction.key = 'UMAP_', - verbose = TRUE) -{ - library(reticulate) - if (!py_module_available(module = 'umap')) { - stop("Cannot find UMAP, please install through pip (e.g. pip install umap-learn).") - } - if (!is.null(x = seed.use)) { - set.seed(seed = seed.use) - py_set_seed(seed = seed.use) +# rd_Rumap (dat, param) +# +# dat (nsample x nfeat) : full dim. data +# umap.param : umap parameter +# +# contact : changkyul@alleninstitute.org +# +# +# Default umap configuration parameters +# n_neighbors: 15 +# n_components: 2 +# metric: euclidean +# n_epochs: 200 +# input: data +# init: spectral +# min_dist: 0.1 +# set_op_mix_ratio: 1 +# local_connectivity: 1 +# bandwidth: 1 +# alpha: 1 +# gamma: 1 +# negative_sample_rate: 5 +# a: NA +# b: NA +# spread: 1 +# random_state: NA +# transform_state: NA +# knn: NA +# knn_repeats: 1 +# verbose: FALSE +# umap_learn_args: NA +# +rd_Rumap <- function (dat, umap.param,method="umap") { + if(method=="umap"){ + library(umap) + # set up parameters + custom.config = umap.defaults + if (length(umap.param) > 0) { + inparam = names(umap.param) + for (key in inparam) custom.config[[key]] = umap.param[[key]] + } + + # run ummap + if (custom.config$metric == "correlation") { + dat.dist = (1 - cor(t(dat)))/2 + custom.config$metric = "euclidean" + tmp = umap(dat.dist, config=custom.config, random_state=umap.param$random_state, input="dist") + } else { + tmp = umap(dat, config=custom.config, random_state=umap.param$random_state) + } + rd.umap = tmp$layout } - if (typeof(x = n.epochs) == "double") { - n.epochs_as.integer(x = n.epochs) + + return(rd.umap) +} + +umap_param <- function(n_neighbors=25, metric="correlation", min_dist=0.4, random_seed=123) + { + umap.param <- list() + umap.param$n_neighbors = n_neighbors + umap.param$metric = metric + umap.param$min_dist = min_dist + umap.param$random_state = random_seed + return(umap.param) } - umap_import_import(module = "umap", delay_load = TRUE) - umap_umap_import$UMAP( - n_neighbors = as.integer(x = n.neighbors), - n_components = as.integer(x = n.components), - metric = metric, - n_epochs = n.epochs, - learning_rate = learning.rate, - min_dist = min.dist, - spread = spread, - set_op_mix_ratio = set.op.mix.ratio, - local_connectivity = local.connectivity, - repulsion_strength = repulsion.strength, - negative_sample_rate = negative.sample.rate, - a = a, - b = b, - metric_kwds = metric.kwds, - angular_rp_forest = angular.rp.forest, - verbose = verbose) - umap_output= umap$fit_transform(mat) - colnames(umap_output)=paste0(reduction.key, 1:ncol(x = umap_output)) - rownames(umap_output)=rownames(object) - return(umap_output) + +# +# PCA_umap (rd.dat.list, cl, Comb.dat, ref.set, N.sampled.cells, umap.param) +# +# rd.dat.list[[ref.set]] : dimension reduction data for each platform +# cl : cluster result +# Comb.dat : combined data set +# ref.set : platform to be used for reference +# N.sampled.cells : max number of cells selected in each cluster +# umap.param : umap parameter +# +# contact : changkyul@alleninstitute.org +# +PCA_umap <- function(dat, + cl, + rm.eigen=NULL, + rm.th=0.6, + umap.param = NULL,... ) +{ + rd.dat = rd_PCA(dat, select.cells = names(cl),...) + if(!is.null(rm.eigen)){ + rd.dat = filter_RD(rd.dat, rm.eigen, rm.th) + } + ###################################### + # UMAP + if (is.null(umap.param)) { + umap.param= umap_param() + } + umap = rd_Rumap(rd.dat[sampled.cells,], umap.param=umap.param) + return(umap) } + + diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 01620f9..bf28eff 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -572,10 +572,10 @@ plot_2d_umap_anno <- function(umap.fn, tmp.color = setNames(as.character(tmp.df$color), tmp.df$label) g= plot_RD_meta(umap.2d, - factor(umap.df[,paste0(m, "_label")], - levels=names(tmp.color)), - meta.col = tmp.color, - alpha=alpha) + factor(umap.df[,paste0(m, "_label")], + levels=names(tmp.color)), + meta.col = tmp.color, + alpha=alpha) if(show.legend==TRUE){ print("legend") @@ -583,8 +583,8 @@ plot_2d_umap_anno <- function(umap.fn, legend <- cowplot::get_legend(g) g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ theme_void() + - theme(legend.position="none") + - coord_fixed(ratio=1) + theme(legend.position="none") + + coord_fixed(ratio=1) g <- cowplot::plot_grid(g, legend, ncol=2) plot.list[[m]] <- g } diff --git a/src/impute.cpp b/src/impute.cpp new file mode 100644 index 0000000..c0dc41d --- /dev/null +++ b/src/impute.cpp @@ -0,0 +1,74 @@ +#include + +using namespace Rcpp; +// [[Rcpp::export]] +void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_idx, NumericMatrix dat, Nullable gene_idx_, Nullable w_mat_, NumericMatrix impute_dat,bool transpose_input, bool transpose_output) +{ + + NumericMatrix* w_mat = NULL; + IntegerVector* gene_idx=NULL; + if(w_mat_.isNotNull()){ + w_mat = new NumericMatrix(w_mat_); + } + + if(gene_idx_.isNotNull()){ + gene_idx = new IntegerVector(gene_idx_); + *gene_idx = *gene_idx - 1; + //std::cout << gene_idx->length() << "\n"; + } + //std::cout << transpose_input <<"\t" << transpose_output <<'\n'; + for(int j=0; j < knn_idx.ncol();j++){ + for(int i=0; i < cell_idx.length(); i++){ + int cell_id = cell_idx[i]-1; + int knn_id = knn_idx(cell_id, j)-1; + int ref_id = ref_idx[knn_id] -1; + float w = 1.0/knn_idx.ncol(); + //std::cout << cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; + if(w_mat!=NULL){ + w = (*w_mat)(i,j); + } + if(transpose_output){ + if(gene_idx_.isNotNull()){ + for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ + if(transpose_input){ + impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + dat(ref_id,*it) * w; + } + else{ + impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + dat(*it,ref_id) * w; + } + } + } + else{ + if(transpose_input){ + impute_dat(cell_id,_) = impute_dat(cell_id,_) + dat(ref_id,_) * w; + } + else{ + impute_dat(cell_id,_) = impute_dat(cell_id,_) + dat(_,ref_id) * w; + } + } + } + else{ + if(gene_idx_.isNotNull()){ + for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ + if(transpose_input){ + impute_dat(*it,cell_id) = impute_dat(*it,cell_id) + dat(ref_id,*it) * w; + } + else{ + //std::cout << cell_id << "\t"<<*it << "\t" << ref_id << "\t" << dat.nrow() << "\t" << dat.ncol() << "\n"; + impute_dat(*it,cell_id) = impute_dat(*it,cell_id) + dat(*it,ref_id) * w; + } + } + } + else{ + if(transpose_input){ + impute_dat(_,cell_id) = impute_dat(_,cell_id) + dat(ref_id,_) * w; + } + else{ + impute_dat(_,cell_id) = impute_dat(_,cell_id) + dat(_,ref_id) * w; + //std::cout << impute_dat(808, cell_id) <<"\n"; + } + } + } + } + } +} From 3db4f2be9d6a95ca4d02e4dd3d72142c81689254 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 15 Feb 2021 17:11:57 -0800 Subject: [PATCH 27/70] Increase version number --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4731816..5650709 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.1 -Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut","cre")), +Version: 1.0.2 +Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), person("Cindy", "van Velthoven", email = "cindy.vanvelthoven@alleninstitute.org", role = c("aut")), From a066dd9c9027fb62cc419c6e9b248eda42359639 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 15 Feb 2021 17:29:21 -0800 Subject: [PATCH 28/70] Fix typo --- R/consensusCluster.R | 3 +-- R/merge_cl.R | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 47c020e..498e8dd 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -530,8 +530,7 @@ run_consensus_clust <- function(norm.dat, select.cells=sample(all.cells, round(length(all.cells)*sample.frac)) save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) - result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) - result=merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param) + result <- scrattch.hicat::iter_clust_merge(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) save(result, file=outfile) } if(is.null(co.result)){ diff --git a/R/merge_cl.R b/R/merge_cl.R index 16a95e7..42b5781 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -246,7 +246,7 @@ merge_cl<- function(norm.dat, iter_clust_merge <- function(norm.dat, select.cells, merge.type="undirectional", de.param = de_param(), max.cl.size = 300,...) { result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells, de.param = de.param, merge.type=merge.type, ...) - result=merge_cl(norm.dat, cl=cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) + result=merge_cl(norm.dat, cl=result$cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) return(result) } From 70428821ecd843ae81d1eb7f58a50c7eee7005c9 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 15 Feb 2021 23:40:50 -0500 Subject: [PATCH 29/70] Resolve namespace --- R/reduceDimension_PCA.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index 304d5e3..a2e3d02 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -45,10 +45,10 @@ get_PCA <- function(dat, max.pca, verbose=FALSE, method="zscore",th=2,fun="prcom { library(Matrix) library(stats) + dat = as.matrix(dat) if(rot){ dat = t(dat) } - dat = as.matrix(dat) if(fun=="prcomp"){ pca = stats::prcomp(dat,tol=0.01) } From f04144ac1c14c1db8c5a3dd6f85780b69aacf7af Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 22 Feb 2021 17:48:52 -0500 Subject: [PATCH 30/70] Switch doParallel with doMC package for parallelization --- DESCRIPTION | 9 +++--- NAMESPACE | 1 + R/consensusCluster.R | 19 ++++-------- R/de.genes.R | 13 --------- R/find_noise_cl.R | 10 ------- R/harmonize.R | 7 ++--- R/harmonize_impute.R | 69 -------------------------------------------- R/map_to_dend.R | 31 +++++++------------- R/markers.R | 38 ++++-------------------- 9 files changed, 30 insertions(+), 167 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 5650709..278162a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.2 +Version: 1.0.3 Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), @@ -21,13 +21,14 @@ Requires: Matrix,Rphenograph, Imports: Rcpp, RcppAnnoy, - data.table, - dendextend, - doParallel, + parallel, + doMC, foreach, + data.table, dplyr, ggplot2, grid, + dendextend, Matrix, matrixStats, pvclust, diff --git a/NAMESPACE b/NAMESPACE index d75f824..4100592 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1 +1,2 @@ +import("Rcpp") exportPattern("^[[:alpha:]]+") diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 498e8dd..6ae24f0 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -242,12 +242,10 @@ collect_subsample_cl_matrix <- function(norm.dat,result.files,all.cells,max.cl.s cl.list = cl.list[!sapply(cl.list,is.null)] } else{ + require(doMC) require(foreach) - require(doParallel) - cl <- makeForkCluster(mc.cores) - registerDoParallel(cl) + registerDoMC(cores=mc.cores) cl.list= foreach(i=1:niter, .combine='c') %dopar% run(f) - stopCluster(cl) } if(!is.null(max.cl.size)){ select.cells= sample_cl_list(cl.list, max.cl.size=max.cl.size) @@ -518,8 +516,6 @@ run_consensus_clust <- function(norm.dat, all.cells= intersect(all.cells, names(init.result$cl)) } run <- function(i,...){ - require(foreach) - require(parallel) prefix = paste("iter",i,sep=".") print(prefix) library(Matrix) @@ -537,16 +533,11 @@ run_consensus_clust <- function(norm.dat, if (mc.cores==1){ sapply(1:niter, function(i){run(i,...)}) } - else{ - - require(doParallel) - require(parallel) + else{ + require(doMC) require(foreach) - - cl <- parallel::makeCluster(mc.cores) - doParallel::registerDoParallel(cl) + registerDoMC(cores=mc.cores) foreach::foreach(i=1:niter,.packages=c("scrattch.hicat","Matrix"), .combine='c') %dopar% { run(i) } - parallel::stopCluster(cl) } result.files=file.path(output_dir, dir(output_dir, "result.*.rda")) co.result <- collect_subsample_cl_matrix(norm.dat,result.files,all.cells) diff --git a/R/de.genes.R b/R/de.genes.R index 01eca06..86ab9a9 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -654,19 +654,6 @@ de_pair_fast_limma <- function(pair, else if (method == "t.test"){ cl.vars <- as.data.frame(get_cl_vars(norm.dat, cl, cl.means = cl.means)) } - if(nrow(pairs)< 50){ - mc.cores=1 - } - if (mc.cores == 1) { - registerDoSEQ() - } - else { - require("doParallel") - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } - de_list = parallel::pvec(1:nrow(pairs), function(x){ tmp=sapply(x, function(i){ if(method == "limma") { diff --git a/R/find_noise_cl.R b/R/find_noise_cl.R index 5ada91d..cf9764a 100644 --- a/R/find_noise_cl.R +++ b/R/find_noise_cl.R @@ -289,16 +289,6 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) if(is.null(de.genes)){ stop("Need to specify de.genes") } - require(foreach) - require(doParallel) - if (mc.cores == 1) { - registerDoSEQ() - } - else { - cores <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(cores) - on.exit(parallel::stopCluster(cores), add = TRUE) - } result.list= parallel::pvec(names(de.genes), function(pairs){ result.list= sapply(pairs, function(p){ de = de.genes[[p]] diff --git a/R/harmonize.R b/R/harmonize.R index db5a447..6500a10 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -149,14 +149,13 @@ sample_sets_list <- function(cells.list, cl.list, cl.sample.size=100, sample.siz batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) { require(foreach) - require(doParallel) + require(doMC) if (mc.cores == 1) { registerDoSEQ() } else { - cl <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(cl) - on.exit(parallel::stopCluster(cl), add = TRUE) + registerDoMC(cores=mc.cores) + on.exit(parallel::stopCluster(), add = TRUE) } bins = split(x, floor((1:length(x))/batch.size)) results= foreach(i=1:length(bins), .combine=.combine) %dopar% FUN(bins[[i]],...) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 2d8d956..956cb7d 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -109,75 +109,6 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose impute.dat } -impute_knn_old <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, mc.cores=1,transpose=FALSE,th=NULL,sparse=FALSE,batch.size=100000,combine=TRUE,...) - { - require(doParallel) - query = row.names(knn.idx) - if(is.null(w)){ - if(!is.null(knn.dist)){ - w = get_knn_weight(knn.dist,...) - w = w/rowSums(w,na.rm=TRUE) - } - else{ - w = 1/ncol(knn.idx) - } - } - else{ - w = w/rowSums(w,na.rm=TRUE) - } - if(nrow(knn.idx) < batch.size){ - mc.cores=1 - } - if (mc.cores == 1) { - registerDoSEQ() - } - else { - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } - k = 1:nrow(knn.idx) - bins = split(k, floor(k/batch.size)) - impute.dat = foreach(j=1:length(bins),.combine="c") %dopar% { - x = bins[[j]] - impute.dat <- matrix(0, nrow=length(x),ncol=ncol(dat)) - for(i in 1:ncol(knn.idx)){ - #cat("bin", x[1],i, "\n") - nn = reference[knn.idx[x,i]] - select = nn %in% row.names(dat) - tmp.dat = dat[nn[select],] - ###Ignore the neighbors not present in imputation reference - if(length(w)>1){ - impute.dat[select,] <<- impute.dat[select,] + tmp.dat* w[select, i] - } - else{ - impute.dat[select,] <<- impute.dat[select,] + tmp.dat* w - } - rm(tmp.dat) - gc() - } - row.names(impute.dat) = row.names(knn.idx)[x] - colnames(impute.dat) = colnames(dat) - if(!is.null(th)){ - impute.dat[impute.dat < th] = 0 - } - if(transpose){ - impute.dat = t(impute.dat) - } - if(sparse){ - impute.dat = Matrix(impute.dat, sparse=T) - } - return(list(impute.dat)) - } - if(combine){ - method="rbind" - if(transpose){ - method="cbind" - } - impute.dat = do.call(method, impute.dat) - } - return(impute.dat) - } #' Title diff --git a/R/map_to_dend.R b/R/map_to_dend.R index ff5148d..63966c5 100644 --- a/R/map_to_dend.R +++ b/R/map_to_dend.R @@ -332,29 +332,18 @@ map_dend_membership <- bs.num = 100, ...) { - if (mc.cores == 1) { - mem = sapply(1:bs.num, function(i) { - print(i) - ###determine which branch to t - - tmp = map_dend(dend, cl, cl.med, dat, map.dat, map.cells, ...) - }, simplify = F) - memb = unlist(mem) + library(doMC) + require(foreach) + if(mcores ==1){ + registerDoSEQ() } else{ - require(foreach) - require(doParallel) - #fcluster <-makeCluster(mc.cores) - fcluster <- makeForkCluster(mc.cores) - registerDoParallel(fcluster) - #on.exit(stopCluster(fcluster)) - mem = foreach(i = 1:bs.num, .combine = 'cbind') %dopar% map_dend(dend, cl, cl.med, dat, map.dat, map.cells, ...) - - stopCluster(fcluster) - memb = as.character(mem) - names(memb) = rownames(mem) + registerDoMC(cores=mc.cores) + on.exit(parallel::stopCluster(), add = TRUE) } - + mem = foreach(i = 1:bs.num, .combine = 'cbind') %dopar% map_dend(dend, cl, cl.med, dat, map.dat, map.cells, ...) + memb = as.character(mem) + names(memb) = rownames(mem) memb = data.frame(cell = names(memb), cl = memb) memb = table(memb$cell, memb$cl) memb = memb / bs.num @@ -423,4 +412,4 @@ mapping <- write.csv(mapping.df, file=file.path(paste0("mapping.df.csv"))) write.csv(memb, file=file.path( paste0("mapping.memb.csv"))) return (list(memb, mapping.df)) - } \ No newline at end of file + } diff --git a/R/markers.R b/R/markers.R index c81be59..53a50c9 100644 --- a/R/markers.R +++ b/R/markers.R @@ -20,14 +20,6 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1, } pairs.df = get_pairs(names(de.genes)) select.pairs = row.names(pairs.df)[pairs.df[,1] %in% cl & pairs.df[,2]%in% cl] - if (mc.cores == 1) { - registerDoSEQ() - } - else { - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } de.markers = parallel::pvec(select.pairs, function(s){ sapply(s, function(x){ @@ -59,17 +51,8 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1, #' @examples get_gene_score <- function(de.genes,cl.means=NULL, all.genes=NULL, top.n=50, max.num=1000,bin.th=4, mc.cores=1) { - require(Matrix) - require(doParallel) + require(Matrix) require(parallel) - if (mc.cores == 1) { - registerDoSEQ() - } - else { - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } if(is.null(all.genes)){ all.genes <- parallel::pvec(names(de.genes), function(x){ @@ -377,7 +360,7 @@ select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.s #' @examples select_pos_markers <- function(de.genes, cl, cl.means=NULL, n.markers=3, default.markers=NULL, rm.genes=NULL, up.gene.score=NULL, down.gene.score=NULL,mc.cores=1) { - require("doParallel") + library(parallel) if(!is.null(de.genes)){ pairs.df = get_pairs(names(de.genes)) } @@ -418,16 +401,7 @@ select_top_pos_markers <- function(de.genes, cl, n.markers=3, up.gene.score, dow { library(parallel) pairs.df = get_pairs(names(de.genes)) - library(doParallel) - if (mc.cores == 1) { - registerDoSEQ() - } - else { - Clu <- makeForkCluster(mc.cores) - doParallel::registerDoParallel(Clu) - on.exit(parallel::stopCluster(Clu), add = TRUE) - } - + ###for each cluster, find markers that discriminate it from other types cl.markers <- parallel::pvec(levels(cl), function(x){ sapply(x, function(tmp.cl){ @@ -615,13 +589,13 @@ within_group_specific_markers <- function(cl.g, norm.dat, cl, ...) #' #' @examples get_beta_score <- function(propExpr, spec.exp = 2, mcores=1){ + library(doMC) if(mcores ==1){ registerDoSEQ() } else{ - cl <- parallel::makeForkCluster(mcores) - doParallel::registerDoParallel(cl) - on.exit(parallel::stopCluster(cl), add = TRUE) + registerDoMC(cores=mc.cores) + on.exit(parallel::stopCluster(), add = TRUE) } calc_beta <- function(y, spec.exp = 2, eps1 = 1e-10) { d1 <- as.matrix(dist(y)) From 631bd584cee5e0e37777e3ef58b43412d42b9132 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 22 Feb 2021 17:52:42 -0500 Subject: [PATCH 31/70] Switch Rphenograph package --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fa4248..b5ba80e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Dev: [![Travis build status](https://travis-ci.org/AllenInstitute/scrattch.hicat source("https://bioconductor.org/biocLite.R") biocLite("limma") -devtools::install_github("JinmiaoChenLab/Rphenograph") +devtools::install_github("i-cyto/Rphenograph") ``` Once these dependencies are installed, `scrattch.hicat` can be installed with: From f43f8991360c56ae26efa476a55fb91259dfa0ad Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 12:55:32 -0500 Subject: [PATCH 32/70] Bug fix with predict_knn --- DESCRIPTION | 2 +- R/harmonize_impute.R | 2 +- src/impute.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 278162a..0c32c01 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.3 +Version: 1.0.4 Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 956cb7d..40f0f14 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -61,7 +61,7 @@ predict_knn <- function(knn.idx, reference, cl, ...) library(matrixStats) library(dplyr) dat = as.matrix(get_cl_mat(cl)) - result = impute_knn(knn.idx, reference, dat, ...) + result = impute_knn(knn.idx, reference, dat, transpose_input=TRUE, ...) pred.cl = setNames(colnames(result)[apply(result, 1, which.max)], row.names(result)) pred.score = setNames(rowMaxs(result), row.names(result)) pred.df = data.frame(pred.cl, pred.score) diff --git a/src/impute.cpp b/src/impute.cpp index c0dc41d..02b8e30 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -23,7 +23,7 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ int knn_id = knn_idx(cell_id, j)-1; int ref_id = ref_idx[knn_id] -1; float w = 1.0/knn_idx.ncol(); - //std::cout << cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; + //std::cout << cell_id <<"\t"<< j << "\t"<< knn_id <<"\t" << ref_id <<"\n"; if(w_mat!=NULL){ w = (*w_mat)(i,j); } From 1b3b7823848ee2859f341f706fbd5d41b101f0b2 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 13:23:43 -0500 Subject: [PATCH 33/70] Bug fix with predict_knn --- R/harmonize_impute.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 40f0f14..7f99e36 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -61,7 +61,7 @@ predict_knn <- function(knn.idx, reference, cl, ...) library(matrixStats) library(dplyr) dat = as.matrix(get_cl_mat(cl)) - result = impute_knn(knn.idx, reference, dat, transpose_input=TRUE, ...) + result = impute_knn(knn.idx, reference, dat, transpose_input=TRUE, transpose_output=TRUE,...) pred.cl = setNames(colnames(result)[apply(result, 1, which.max)], row.names(result)) pred.score = setNames(rowMaxs(result), row.names(result)) pred.df = data.frame(pred.cl, pred.score) From c4d09caa3c073fa74bd4cbbd3d1cf6230d05a22d Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 14:11:49 -0500 Subject: [PATCH 34/70] predict_knn bug fix --- R/harmonize.R | 2 +- R/markers.R | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index 6500a10..a05856d 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -439,7 +439,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= cl = setNames(result$cl.mat[,1], row.names(result$cl.mat)) if(length(cl) < nrow(result$knn)){ diff.cells = setdiff(row.names(result$knn), names(cl)) - pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl, mc.cores=ncores )$pred.df + pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl )$pred.df pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) diff --git a/R/markers.R b/R/markers.R index 53a50c9..486663b 100644 --- a/R/markers.R +++ b/R/markers.R @@ -602,7 +602,6 @@ get_beta_score <- function(propExpr, spec.exp = 2, mcores=1){ score1 <- sum(d1^spec.exp) / (sum(d1) + eps1) return(score1) } - res <- foreach(i = 1:nrow(propExpr), .combine="c") %dopar% { print(i) calc_beta(propExpr[i,]) From 1adc0fd3c287bce61b76a4f6a84e1a96b5fd6804 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 13:11:45 -0800 Subject: [PATCH 35/70] Remove obsolete functions --- R/harmonize_impute.R | 129 ------------------------------------------- 1 file changed, 129 deletions(-) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 7f99e36..0f194f7 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -111,135 +111,6 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose -#' Title -#' -#' @param knn -#' @param ref -#' @param dat -#' @param tol -#' @param max.iter -#' @param ... -#' -#' @return -#' @export -#' -#' @examples -iter_impute_knn <- function(knn, ref, dat, tol=10^-3,max.iter=100,...) - { - old.dat = NULL - iter=0 - while(TRUE){ - iter= iter+1 - new.dat = impute_knn(knn, ref, dat,...) - if(!is.null(old.dat)){ - diff = new.dat - old.dat - diff.scaled = sum(abs(diff))/sum(abs(old.dat)) - print(iter) - print(diff.scaled) - if(diff.scaled < tol | iter > max.iter ){ - break - } - } - dat = old.dat = new.dat - } - return(new.dat) - } - - - - - -#' Title -#' -#' @param comb.dat -#' @param split.results -#' @param select.genes -#' @param select.cells -#' @param ref.list -#' @param sets -#' @param max.dim -#' @param th -#' @param rm.eigen -#' @param rm.th -#' -#' @return -#' @export -#' -#' @examples -impute_knn_global_old <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) - { - library(matrixStats) - org.rd.dat.list <- list() - knn.list <- list() - impute.dat.list <- list() - ###Impute the reference dataset in the original space globally - for(x in names(ref.list)) - { - print(x) - tmp.cells= select.cells[comb.dat$meta.df[select.cells,"platform"]==x] - ref.cells = ref.list[[x]] - rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th, method=method,mc.cores=mc.cores,verbose=verbose) - org.rd.dat.list[[x]] = rd.result - rd.result = org.rd.dat.list[[x]] - if(!is.null(rm.eigen)){ - rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th,verbose=verbose) - } - print(ncol(rd.dat)) - knn.result = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k) - row.names(knn.result[[1]]) = row.names(rd.dat) - knn.list[[x]]=knn.result - knn = knn.list[[x]][[1]] - impute.dat = matrix(0, ncol=length(select.cells),nrow=length(select.genes)) - row.names(impute.dat)=select.genes - colnames(impute.dat) = select.cells - impute.result <- impute_knn(knn, ref.cells, t(as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells])),mc.cores=mc.cores, sparse=TRUE, transpose=TRUE,combine=FALSE) - for(i in 1:length(impute.result)){ - print(i) - dat = impute.result[[i]] - impute.dat[,colnames(dat)] <- as.matrix(dat) - } - impute.dat.list[[x]] = impute.dat - } - - impute.genes=NULL - for(x in names(split.results)){ - print(x) - result = split.results[[x]] - cl = result$cl - knn = result$knn - for(ref.set in intersect(names(result$ref.list),names(ref.list))){ - print(ref.set) - tmp.cells = row.names(knn) - add.cells=FALSE - query.cells = intersect(tmp.cells[comb.dat$meta.df[tmp.cells,"platform"] != ref.set], select.cells) - if(is.null(impute.genes)){ - impute.genes = select.genes - } - else{ - impute.genes=intersect(select.genes,c(result$markers, result$select.genes)) - } - select.cols = comb.dat$meta.df[comb.dat$all.cells[knn[1,]],"platform"] == ref.set - cat("Impute genes", length(impute.genes),"\n") - if(sum(select.cols)==0){ - next - } - ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) - select.knn = knn[query.cells,select.cols] - dat = t(impute.dat.list[[ref.set]][impute.genes,ref.cells]) - impute.result = impute_knn(select.knn, comb.dat$all.cells, dat=dat, transpose=TRUE, mc.cores=mc.cores,combine=FALSE) - for(i in 1:length(impute.result)){ - impute.dat = impute.result[[i]] - impute.dat.list[[ref.set]][impute.genes,colnames(impute.dat)] <- impute.dat - rm(impute.dat) - gc() - } - } - } - - ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. - return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) - } - From 69feb6e97a0e919374e6668d956bfa9867cd330e Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 13:17:34 -0800 Subject: [PATCH 36/70] change NAMESPACE --- NAMESPACE | 1 + 1 file changed, 1 insertion(+) diff --git a/NAMESPACE b/NAMESPACE index 4100592..db62413 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,2 +1,3 @@ import("Rcpp") exportPattern("^[[:alpha:]]+") +useDynLib(scrattch.hicat) From 876e871524b2b4791ac81e9ee2574fec6c59f12f Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 13:41:49 -0800 Subject: [PATCH 37/70] Add RcppExport.R --- NAMESPACE | 5 +++-- R/RcppExports.R | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 R/RcppExports.R diff --git a/NAMESPACE b/NAMESPACE index db62413..ec2f46c 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,3 +1,4 @@ -import("Rcpp") -exportPattern("^[[:alpha:]]+") useDynLib(scrattch.hicat) +importFrom(Rcpp, sourceCpp) +exportPattern("^[[:alpha:]]+") + diff --git a/R/RcppExports.R b/R/RcppExports.R new file mode 100644 index 0000000..b2b917f --- /dev/null +++ b/R/RcppExports.R @@ -0,0 +1,8 @@ +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + + +ImputeKnn <- function(knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output) { + invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output)) +} + From d860a04c3524418f10c6caac186480ff306d7309 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 24 Feb 2021 13:56:17 -0800 Subject: [PATCH 38/70] Add RcppExport.cpp --- src/RcppExports.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/RcppExports.cpp diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp new file mode 100644 index 0000000..771a5e2 --- /dev/null +++ b/src/RcppExports.cpp @@ -0,0 +1,35 @@ +// Generated by using Rcpp::compileAttributes() -> do not edit by hand +// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +#include + +using namespace Rcpp; + +// ImputeKnn +void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_idx, NumericMatrix dat, Nullable gene_idx_, Nullable w_mat_, NumericMatrix impute_dat, bool transpose_input, bool transpose_output); +RcppExport SEXP _scrattch_hicat_ImputeKnn(SEXP knn_idxSEXP, SEXP cell_idxSEXP, SEXP ref_idxSEXP, SEXP datSEXP, SEXP gene_idx_SEXP, SEXP w_mat_SEXP, SEXP impute_datSEXP, SEXP transpose_inputSEXP, SEXP transpose_outputSEXP) { +BEGIN_RCPP + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< IntegerMatrix >::type knn_idx(knn_idxSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type cell_idx(cell_idxSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type ref_idx(ref_idxSEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type dat(datSEXP); + Rcpp::traits::input_parameter< Nullable >::type gene_idx_(gene_idx_SEXP); + Rcpp::traits::input_parameter< Nullable >::type w_mat_(w_mat_SEXP); + Rcpp::traits::input_parameter< NumericMatrix >::type impute_dat(impute_datSEXP); + Rcpp::traits::input_parameter< bool >::type transpose_input(transpose_inputSEXP); + Rcpp::traits::input_parameter< bool >::type transpose_output(transpose_outputSEXP); + ImputeKnn(knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output); + return R_NilValue; +END_RCPP +} + +static const R_CallMethodDef CallEntries[] = { + {"_scrattch_hicat_ImputeKnn", (DL_FUNC) &_scrattch_hicat_ImputeKnn, 9}, + {NULL, NULL, 0} +}; + +RcppExport void R_init_scrattch_hicat(DllInfo *dll) { + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +} From 6748ca8549b7eefe5e1a85e66ed655c37bfc2435 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 8 Mar 2021 13:00:18 -0500 Subject: [PATCH 39/70] Bug fix for impute_knn --- R/harmonize.R | 13 +++++++------ R/harmonize_impute.R | 21 ++++++++++++++------- R/util.R | 8 +++++--- src/impute.cpp | 11 ++++++----- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index a05856d..ad27ca1 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -251,7 +251,7 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all { select.genes.list = list() for(ref.set in names(ref.list)){ - print(ref.set) + #print(ref.set) ref.cells = intersect(ref.list[[ref.set]], select.cells) ref.dat = comb.dat$dat.list[[ref.set]][,ref.cells] ###if cluster membership is available, use cluster DE genes @@ -263,7 +263,7 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all return(NULL) } de.genes = comb.dat$de.genes.list[[ref.set]] - print(length(de.genes.list[[ref.set]])) + #print(length(de.genes.list[[ref.set]])) select.genes = display_cl(cl, norm.dat=ref.dat, max.cl.size = 200, n.markers=20, de.genes= de.genes)$markers select.genes = intersect(select.genes, comb.dat$common.genes) } @@ -294,10 +294,10 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all if(sum(select)==0){ return(NULL) } - print(rm.cor) - if(sum(!select)>0){ - print(rm.cor[!select,,drop=F]) - } + #print(rm.cor) + #if(sum(!select)>0){ + # print(rm.cor[!select,,drop=F]) + #} rot = rot[,select,drop=FALSE] } if(is.null(rot)){ @@ -378,6 +378,7 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb } if(!is.null(comb.dat$cl.list)){ test.knn = test_knn(knn, comb.dat$cl.list[[set]], colnames(ref.dat), comb.dat$cl.list[[ref.set]]) + if(!is.null(test.knn)){ cat("Knn", set, ref.set, method, "cl.score", test.knn$cl.score, "cell.score", test.knn$cell.score,"\n") } diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 0f194f7..2ae0f65 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -124,6 +124,9 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell for(x in names(ref.list)) { print(x) + impute.dat = matrix(0, nrow=length(select.genes), ncol=length(select.cells)) + dimnames(impute.dat) = list(select.genes, select.cells) + impute.dat.list[[x]] = impute.dat tmp.cells= select.cells[comb.dat$meta.df[select.cells,"platform"]==x] ref.cells = ref.list[[x]] rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th, method=method,mc.cores=mc.cores,verbose=verbose) @@ -132,11 +135,14 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell if(!is.null(rm.eigen)){ rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th,verbose=verbose) } - print(ncol(rd.dat)) - + print(ncol(rd.dat)) knn = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k)[[1]] - row.names(knn) = row.names(rd.dat) - impute.dat.list[[x]] = impute_knn(knn, ref.cells, as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells])) + row.names(knn) = row.names(rd.dat) + cell.id = match(row.names(rd.dat), select.cells) + dat = as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells]) + reference.id = 1:length(ref.cells) + gene.id = 1:length(select.genes) + ImputeKnn(knn, cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[x]], transpose_input=FALSE, transpose_output=FALSE) } ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. @@ -164,9 +170,10 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell } ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) select.knn = knn[query.cells,select.cols] - gene.id = match(impute.genes, row.names(impute.dat.list[[ref.set]])) - cell.id = 1:nrow(select.knn) - reference.id = match(comb.dat$all.cells, colnames(impute.dat.list[[ref.set]])) + dat = impute.dat.list[[ref.set]] + gene.id = match(impute.genes, row.names(dat)) + cell.id = match(query.cells, colnames(dat)) + reference.id = match(comb.dat$all.cells, colnames(dat)) ImputeKnn(select.knn,cell.id, reference.id, dat=impute.dat.list[[ref.set]], gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[ref.set]], transpose_input=FALSE, transpose_output=FALSE) } } diff --git a/R/util.R b/R/util.R index b3501c2..d993abb 100644 --- a/R/util.R +++ b/R/util.R @@ -523,9 +523,11 @@ sample_cells <- function(cl, #' #' @export #' -cpm <- function(counts) { - - sf <- Matrix::colSums(counts) / 1e6 +cpm <- function(counts, sf=NULL, demon=1e6) { + if(is.null(sf)){ + sf <- Matrix::colSums(counts) + } + sf = sf/ denom if(is.matrix(counts)){ return(t(t(counts) / sf)) diff --git a/src/impute.cpp b/src/impute.cpp index 02b8e30..1fd38ac 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -14,16 +14,18 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ if(gene_idx_.isNotNull()){ gene_idx = new IntegerVector(gene_idx_); *gene_idx = *gene_idx - 1; - //std::cout << gene_idx->length() << "\n"; + std::cout << gene_idx->length() << "\n"; } - //std::cout << transpose_input <<"\t" << transpose_output <<'\n'; + std::cout << transpose_input <<"\t" << transpose_output <<'\n'; for(int j=0; j < knn_idx.ncol();j++){ for(int i=0; i < cell_idx.length(); i++){ int cell_id = cell_idx[i]-1; - int knn_id = knn_idx(cell_id, j)-1; + int knn_id = knn_idx(i, j)-1; int ref_id = ref_idx[knn_id] -1; float w = 1.0/knn_idx.ncol(); - //std::cout << cell_id <<"\t"<< j << "\t"<< knn_id <<"\t" << ref_id <<"\n"; + //if(i==cell_idx.length()-1){ + //std::cout << j <<"\t"<< cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; + //} if(w_mat!=NULL){ w = (*w_mat)(i,j); } @@ -65,7 +67,6 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ } else{ impute_dat(_,cell_id) = impute_dat(_,cell_id) + dat(_,ref_id) * w; - //std::cout << impute_dat(808, cell_id) <<"\n"; } } } From c789fbd72bcb000497db0a0dc9c621fdc1877f75 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 8 Mar 2021 15:51:09 -0500 Subject: [PATCH 40/70] Remove debugging comments --- R/harmonize_merge.R | 30 +++++++++++++++--------------- src/impute.cpp | 6 +++--- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 0806fe7..c977279 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -206,7 +206,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]) if(include.y){ if(!is.null(cl.means.list[[set]])){ - cl.means.list[[set]][[y]] = tmp.means + cl.means.list[[set]][[y]] = tmp.means[row.names(cl.means.list[[set]])] } else{ cl.means.list[[set]] = data.frame(tmp.means) @@ -222,7 +222,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo tmp.sqr.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F]^2) if(include.y){ if(!is.null(cl.sqr.means.list[[set]])){ - cl.sqr.means.list[[set]][[y]] = tmp.sqr.means + cl.sqr.means.list[[set]][[y]] = tmp.sqr.means[row.names(cl.sqr.means.list[[set]])] } else{ cl.sqr.means.list[[set]] = data.frame(tmp.means) @@ -238,7 +238,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo tmp.means = Matrix::rowMeans(merge.dat.list[[set]][,tmp.cells2,drop=F] >= merge.de.param.list[[set]]$low.th) if(include.y){ if(!is.null(cl.present.list[[set]])){ - cl.present.list[[set]][[y]] = tmp.means + cl.present.list[[set]][[y]] = tmp.means[row.names(cl.present.list[[set]])] } else{ cl.present.list[[set]] = data.frame(tmp.means) @@ -326,13 +326,24 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo return(NULL) } #cl.rd.list = get_cl_means_list(merge.dat.list, merge.de.param.list, select.genes=anchor.genes, cl=cl) - cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, select.genes=anchor.genes, de.param.list = merge.de.param.list) + cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, select.genes=anchor.genes) pairs=NULL ###Merge small clusters first cl.sim = get_cl_sim_multiple(cl.rd.list) if (length(cl.sim)==0) return(NULL) + merge.de.param.list = comb.dat$de.param.list[merge.sets] + common.genes = comb.dat$common.genes + cl.means.list = get_cl_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) + cl.means.list = sapply(cl.means.list, as.data.frame, simplify=F) + + cl.sqr.means.list = get_cl_sqr_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) + cl.sqr.means.list = sapply(cl.sqr.means.list, as.data.frame, simplify=F) + + cl.present.list = get_cl_present_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) + cl.present.list = sapply(cl.present.list, as.data.frame, simplify=F) + while(length(cl.small)>0){ knn = data.frame(cl=cl.small, nn=cl.big[sim_knn(cl.sim[cl.small, cl.big,drop=F],k=1)],stringsAsFactors=FALSE) knn$sim = get_pair_matrix(cl.sim, knn$cl, knn$nn) @@ -354,17 +365,6 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.sqr.means.list = update.result$cl.sqr.means.list cl.small = cl.small[cl.small!=x] } - merge.de.param.list = comb.dat$de.param.list[merge.sets] - common.genes = comb.dat$common.genes - cl.means.list = get_cl_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) - cl.means.list = sapply(cl.means.list, as.data.frame, simplify=F) - - cl.sqr.means.list = get_cl_sqr_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) - cl.sqr.means.list = sapply(cl.sqr.means.list, as.data.frame, simplify=F) - - cl.present.list = get_cl_present_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) - cl.present.list = sapply(cl.present.list, as.data.frame, simplify=F) - de.pairs = NULL de.genes.list = sapply(names(merge.dat.list), function(x)list(),simplify=F) diff --git a/src/impute.cpp b/src/impute.cpp index 1fd38ac..b9fd9d9 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -14,9 +14,9 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ if(gene_idx_.isNotNull()){ gene_idx = new IntegerVector(gene_idx_); *gene_idx = *gene_idx - 1; - std::cout << gene_idx->length() << "\n"; + //std::cout << gene_idx->length() << "\n"; } - std::cout << transpose_input <<"\t" << transpose_output <<'\n'; + //std::cout << transpose_input <<"\t" << transpose_output <<'\n'; for(int j=0; j < knn_idx.ncol();j++){ for(int i=0; i < cell_idx.length(); i++){ int cell_id = cell_idx[i]-1; @@ -24,7 +24,7 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ int ref_id = ref_idx[knn_id] -1; float w = 1.0/knn_idx.ncol(); //if(i==cell_idx.length()-1){ - //std::cout << j <<"\t"<< cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; + //std::cout << j <<"\t"<< cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; //} if(w_mat!=NULL){ w = (*w_mat)(i,j); From a7baef8fa16de0b461d06795c678596f1fffd78d Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 8 Mar 2021 18:54:24 -0500 Subject: [PATCH 41/70] Simplify merging of small clusters during merging --- R/de.genes.R | 2 +- R/harmonize_impute.R | 14 ++++++---- R/harmonize_merge.R | 63 ++++++++++++++++++++++++++------------------ 3 files changed, 48 insertions(+), 31 deletions(-) diff --git a/R/de.genes.R b/R/de.genes.R index 86ab9a9..0cd086d 100644 --- a/R/de.genes.R +++ b/R/de.genes.R @@ -703,7 +703,7 @@ de_pair_fast_limma <- function(pair, cl.size2, return.df = return.df) },simplify=F) - cat(length(tmp), length(x),"\n") + #cat(length(tmp), length(x),"\n") if(length(tmp)!=length(x)){ save(x, file="Error.pairs.rda") stop('length of de_list does not match pairs') diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 2ae0f65..dd994b3 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -56,15 +56,19 @@ predict_knn_small <- function(knn.idx, reference, cl) #' @export #' #' @examples -predict_knn <- function(knn.idx, reference, cl, ...) +predict_knn <- function(knn.idx, reference, target, k=15, train.dat=NULL, test.dat=NULL, ...) { library(matrixStats) library(dplyr) - dat = as.matrix(get_cl_mat(cl)) + if(is.null(knn.idx)){ + knn.idx = RANN::nn2(data=train.dat[reference,],query=test.dat,k=k)[[1]] + row.names(knn.idx) = row.names(test.dat) + } + dat = as.matrix(get_cl_mat(target)) result = impute_knn(knn.idx, reference, dat, transpose_input=TRUE, transpose_output=TRUE,...) - pred.cl = setNames(colnames(result)[apply(result, 1, which.max)], row.names(result)) + pred.target = setNames(colnames(result)[apply(result, 1, which.max)], row.names(result)) pred.score = setNames(rowMaxs(result), row.names(result)) - pred.df = data.frame(pred.cl, pred.score) + pred.df = data.frame(pred.target, pred.score) return(list(pred.df=pred.df, pred.prob=result)) } @@ -135,7 +139,7 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell if(!is.null(rm.eigen)){ rd.dat = filter_RD(rd.result$rd.dat, rm.eigen, rm.th,verbose=verbose) } - print(ncol(rd.dat)) + #print(ncol(rd.dat)) knn = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k)[[1]] row.names(knn) = row.names(rd.dat) cell.id = match(row.names(rd.dat), select.cells) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index c977279..a497a7a 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -171,6 +171,22 @@ get_cl_sim_multiple <- function(cl.rd.list, FUN =pmax) #' @export #' #' @examples +##' .. content for \description{} (no empty lines) .. +##' +##' .. content for \details{} .. +##' @title +##' @param comb.dat +##' @param merge.dat.list +##' @param cl +##' @param anchor.genes +##' @param verbose +##' @param pairBatch +##' @param de.genes.list +##' @param lfc.conservation.th +##' @param merge.type +##' @param de.method +##' @return +##' @author Zizhen Yao merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbose=TRUE, pairBatch=40, de.genes.list=NULL, lfc.conservation.th=0.7, merge.type="undirectional", de.method="fast_limma") { print("merge_cl_multiple") @@ -321,15 +337,33 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.big= cl.platform.counts >= cl.min.cells[rownames(cl.platform.counts)] cl.small = colnames(cl.big)[colSums(cl.big) == 0] cl.big = colnames(cl.big)[colSums(cl.big) > 0] - + if(length(cl.big)==0){ return(NULL) } - #cl.rd.list = get_cl_means_list(merge.dat.list, merge.de.param.list, select.genes=anchor.genes, cl=cl) - cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, select.genes=anchor.genes) + + ###Merge small cells based on KNN prediction + cl.small.cells= names(cl)[cl %in% cl.small] + cl.big.cells= names(cl)[cl %in% cl.big] + if(length(cl.small)>0){ + cl.small.cells.byplatform = split(cl.small.cells, as.character(comb.dat$meta.df[cl.small.cells, "platform"])) + cl.big.cells.byplatform = split(cl.big.cells, comb.dat$meta.df[cl.big.cells, "platform"]) + for(set in names(cl.small.cells.byplatform)){ + query.cells =cl.small.cells.byplatform[[set]] + if(length(query.cells)==0){next} + ref.cells =cl.big.cells.byplatform[[set]] + ref.cells = sample_cells(cl[ref.cells],300) + dat = t(merge.dat.list[[set]][anchor.genes, c(ref.cells, query.cells),drop=F]) + pred.result = predict_knn(knn.idx=NULL, reference = ref.cells, target=cl, k=min(15, ceiling(length(ref.cells)/2)), train.dat = dat[ref.cells,,drop=F], test.dat = dat[query.cells,,drop=F]) + tmp.cl = with(pred.result$pred.df, setNames(pred.target, row.names(pred.result$pred.df))) + print(tmp.cl) + cl[names(tmp.cl)] = tmp.cl + } + } + + cl.rd.list = get_cl_means_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list, select.genes=anchor.genes) pairs=NULL - ###Merge small clusters first cl.sim = get_cl_sim_multiple(cl.rd.list) if (length(cl.sim)==0) return(NULL) @@ -344,27 +378,6 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo cl.present.list = get_cl_present_list(merge.dat.list, cl=cl, de.param.list=merge.de.param.list) cl.present.list = sapply(cl.present.list, as.data.frame, simplify=F) - while(length(cl.small)>0){ - knn = data.frame(cl=cl.small, nn=cl.big[sim_knn(cl.sim[cl.small, cl.big,drop=F],k=1)],stringsAsFactors=FALSE) - knn$sim = get_pair_matrix(cl.sim, knn$cl, knn$nn) - closest.pair = which.max(knn$sim) - x = knn[closest.pair,1] - y= knn[closest.pair,2] - if(verbose > 0){ - cat("Merge: ", x,y, "sim:", knn[closest.pair,3],"\n") - } - update.result=merge_x_y(x, y) - if(is.null(update.result)){ - return(NULL) - } - cl = update.result$cl - cl.rd.list = update.result$cl.rd.list - cl.sim = update.result$cl.sim - cl.means.list = update.result$cl.means.list - cl.present.list = update.result$cl.present.list - cl.sqr.means.list = update.result$cl.sqr.means.list - cl.small = cl.small[cl.small!=x] - } de.pairs = NULL de.genes.list = sapply(names(merge.dat.list), function(x)list(),simplify=F) From 689c6179771eb2433708a77973fe47cae23b92c5 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 8 Mar 2021 19:48:58 -0500 Subject: [PATCH 42/70] Typo fix --- R/cluster.R | 8 ++++++++ R/merge_cl.R | 7 +------ R/util.R | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/R/cluster.R b/R/cluster.R index 8967290..821bf18 100644 --- a/R/cluster.R +++ b/R/cluster.R @@ -482,3 +482,11 @@ combine_finer_split <- function(cl, finer.cl) cl[names(finer.cl)] = finer.cl return(cl) } + + +iter_clust_merge <- function(norm.dat, select.cells, merge.type="undirectional", de.param = de_param(), max.cl.size = 300,...) +{ + result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells, de.param = de.param, merge.type=merge.type, ...) + result=merge_cl(norm.dat, cl=result$cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) + return(result) +} diff --git a/R/merge_cl.R b/R/merge_cl.R index 42b5781..6b7283a 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -243,10 +243,5 @@ merge_cl<- function(norm.dat, -iter_clust_merge <- function(norm.dat, select.cells, merge.type="undirectional", de.param = de_param(), max.cl.size = 300,...) -{ - result <- scrattch.hicat::iter_clust(norm.dat=norm.dat, select.cells=select.cells, de.param = de.param, merge.type=merge.type, ...) - result=merge_cl(norm.dat, cl=result$cl, rd.dat.t = norm.dat[result$markers,], merge.type=merge.type, de.param=de.param, max.cl.size=max.cl.size) - return(result) -} + diff --git a/R/util.R b/R/util.R index d993abb..a859794 100644 --- a/R/util.R +++ b/R/util.R @@ -523,11 +523,11 @@ sample_cells <- function(cl, #' #' @export #' -cpm <- function(counts, sf=NULL, demon=1e6) { +cpm <- function(counts, sf=NULL, denom=1e6) { if(is.null(sf)){ sf <- Matrix::colSums(counts) } - sf = sf/ denom + sf = sf/denom if(is.matrix(counts)){ return(t(t(counts) / sf)) From 67a911e4d8944860aff11df8f8b625e79d50cffb Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 29 Mar 2021 13:02:14 -0700 Subject: [PATCH 43/70] Update patchseq script. Build building reference function --- R/map_to_dend.R | 213 ++++++++++++++++++++---------------------------- R/markers.R | 7 +- 2 files changed, 95 insertions(+), 125 deletions(-) diff --git a/R/map_to_dend.R b/R/map_to_dend.R index 63966c5..6af6efd 100644 --- a/R/map_to_dend.R +++ b/R/map_to_dend.R @@ -10,14 +10,13 @@ #' @param low.th #' #' @return -#' @export +#' @Export #' #' @examples resolve_cl <- function(cl.g, - cl.med, + cl.dat, markers, - dat, map.dat, select.cells, p = 0.7, @@ -29,7 +28,7 @@ resolve_cl <- ###For each branch point, find the highest expression cluster. tmp.med = sapply(cl.g, function(g) - rowMaxs(cl.med[genes, g, drop = F])) + rowMaxs(cl.dat[genes, g, drop = F])) row.names(tmp.med) = genes ###Make sure the genes are discriminative between all the branches. genes = genes[rowMaxs(tmp.med) - rowMins(tmp.med) > 1] @@ -40,7 +39,7 @@ resolve_cl <- ###Compute the correlation with the median cluster profile. ###add drop=F - cl.cor = cor(as.matrix(map.dat[genes, select.cells, drop = F]), cl.med[genes, tmp.cl, drop = + cl.cor = cor(as.matrix(map.dat[genes, select.cells, drop = F]), cl.dat[genes, tmp.cl, drop = F]) cl.cor[is.na(cl.cor)] = 0 ###Compute the best match in each branch. @@ -87,9 +86,8 @@ resolve_cl <- mapped.cl, resolve_cl( cl.g[tmp.cl], - cl.med, + cl.dat, markers, - dat, map.dat, select.cells, p = p, @@ -106,7 +104,7 @@ resolve_cl <- #' #' @param dend #' @param cl -#' @param cl.med +#' @param cl.dat #' @param dat #' @param map.dat #' @param select.cells @@ -120,11 +118,9 @@ resolve_cl <- #' @examples map_dend <- function(dend, - cl, - cl.med, - dat, + cl.dat, map.dat, - select.cells, + select.cells=colnames(map.dat), p = 0.8, low.th = 0.2, default.markers = NULL) @@ -139,22 +135,15 @@ map_dend <- markers = markers[names(markers) %in% row.names(map.dat)] cl.g = sapply(dend, labels, simplify = F) names(cl.g) = 1:length(cl.g) - select.cl = cl[cl %in% unlist(cl.g)] - ###Sampling the cells from the reference cluster - cells = unlist(tapply(names(select.cl), select.cl, function(x) - sample(x, round(length( - x - ) * p)))) genes = names(markers) genes = union(genes, default.markers) mapped.cl = resolve_cl(cl.g, - cl.med, - markers, - dat, - map.dat, - select.cells, - p = p, - low.th = low.th) + cl.dat, + markers, + map.dat, + select.cells, + p = p, + low.th = low.th) if (length(mapped.cl) > 0) { for (i in unique(mapped.cl)) { select.cells = names(mapped.cl)[mapped.cl == i] @@ -162,16 +151,14 @@ map_dend <- final.cl = c( final.cl, map_dend( - dend[[as.integer(i)]], - cl, - cl.med, - dat, - map.dat, - select.cells, - p = p, - low.th = low.th + dend[[as.integer(i)]], + cl.dat, + map.dat, + select.cells, + p = p, + low.th = low.th + ) ) - ) } } return(cl = final.cl) @@ -237,40 +224,41 @@ summarize_cl <- markers.cl.list = do.call("c", markers.cl.list) all.markers = unique(unlist(markers.cl.list)) + gene.anno="" memb.th = lapply(row.names(memb), function(cell) { ###Check all the node with confidence > conf.th x = memb[cell,] mapped.node = colnames(memb)[which(x > conf.th)] - + if(!is.null(min.genes)){ ###Check for detected markers at the given cell - det.genes = all.markers[map.dat[all.markers, cell] >= exp.th] + det.genes = all.markers[map.dat[all.markers, cell] >= exp.th] - ##compute detected markers at every branch point. - gene.olap = sapply(mapped.node, function(i) - intersect(markers.cl.list[[i]], det.genes), simplify = F) - gene.olap.num = sapply(gene.olap, length) - #TO DO: weight markers instead of using absolute counts/ratio. - - ####set the root, so that root always succeed. - gene.olap.num[attr(dend, "label")] = min.genes - gene.olap[attr(dend, "label")] = "" - gene.olap.ratio = gene.olap.num / sapply(markers.cl.list[names(gene.olap.num)], length) - gene.olap.ratio[is.na(gene.olap.ratio)] = 1 - - ###mapped nodes not met the minimal gene number/ratio constraints - fail.node = mapped.node[gene.olap.ratio < min.genes.ratio | - gene.olap.num < min.genes] - if (length(fail.node) > 0) { - ###choose the mapped nodes above any failed nodes - mapped.node = mapped.node[node.height[mapped.node] > max(node.height[fail.node])] + ##compute detected markers at every branch point. + gene.olap = sapply(mapped.node, function(i) + intersect(markers.cl.list[[i]], det.genes), simplify = F) + gene.olap.num = sapply(gene.olap, length) + #TO DO: weight markers instead of using absolute counts/ratio. + ####set the root, so that root always succeed. + gene.olap.num[attr(dend, "label")] = min.genes + gene.olap[attr(dend, "label")] = "" + gene.olap.ratio = gene.olap.num / sapply(markers.cl.list[names(gene.olap.num)], length) + gene.olap.ratio[is.na(gene.olap.ratio)] = 1 + ###mapped nodes not met the minimal gene number/ratio constraints + fail.node = mapped.node[gene.olap.ratio < min.genes.ratio | + gene.olap.num < min.genes] + if (length(fail.node) > 0) { + ###choose the mapped nodes above any failed nodes + mapped.node = mapped.node[node.height[mapped.node] > max(node.height[fail.node])] + } + gene.anno = sapply(mapped.node, function(x) { + paste0(x, ":", paste0(gene.olap[[x]], collapse = " ")) + }) } + ###Choose the deepest nodes that pass all the criteria. mapped.node = mapped.node[order(node.height[mapped.node])] best.node = mapped.node[1] - ###Get the markers on every mapped nodes. - gene.anno = sapply(mapped.node, function(x) { - paste0(x, ":", paste0(gene.olap[[x]], collapse = " ")) - }) + ###Get the markers on every mapped nodes. c( cl = best.node, score = x[best.node], @@ -309,7 +297,7 @@ summarize_cl <- #' #' @param dend #' @param cl -#' @param cl.med +#' @param cl.dat #' @param dat #' @param map.dat #' @param map.cells @@ -323,9 +311,7 @@ summarize_cl <- #' @examples map_dend_membership <- function(dend, - cl, - cl.med, - dat, + cl.dat, map.dat, map.cells, mc.cores = 1, @@ -334,17 +320,17 @@ map_dend_membership <- { library(doMC) require(foreach) - if(mcores ==1){ + if(mc.cores ==1){ registerDoSEQ() } else{ registerDoMC(cores=mc.cores) - on.exit(parallel::stopCluster(), add = TRUE) } - mem = foreach(i = 1:bs.num, .combine = 'cbind') %dopar% map_dend(dend, cl, cl.med, dat, map.dat, map.cells, ...) - memb = as.character(mem) - names(memb) = rownames(mem) - memb = data.frame(cell = names(memb), cl = memb) + mem = foreach(i = 1:bs.num, .combine = 'c') %dopar% { + print(i) + map_dend(dend, cl.dat, map.dat, map.cells, ...) + } + memb = data.frame(cell = names(mem), cl = mem) memb = table(memb$cell, memb$cl) memb = memb / bs.num tmp = get_nodes_attr(dend, "label") @@ -353,63 +339,42 @@ map_dend_membership <- return(memb) } -#' Title -#' -#' @param dend -#' @param cl.df -#' @param cl -#' @param norm.dat -#' @param query.dat -#' @param bp.collapse.th -#' @param mc.cores -#' @param bs.num -#' @param p -#' @param low.th -#' @param conf.th -#' @param min.genes -#' @param min.genes.ratio -#' -#' @return -#' @export -#' -#' @examples -mapping <- - function(dend, - cl.df, - cl, - norm.dat, - query.dat, - bp.collapse.th = NULL,mc.cores=1, bs.num=100, p=0.7, low.th=0.15, conf.th=0.7, min.genes=1, min.genes.ratio=0.3 - ) - { - rownames(cl.df)=cl.df$cluster_id - cltmp=cl.df[as.character(cl),"cluster_label"] - names(cltmp)=names(cl) - cl=factor(cltmp) - - - query.dat.norm = log2(as.matrix(query.dat+1)) - idx=match(rownames(norm.dat), rownames(query.dat.norm)) - query.dat.norm=query.dat.norm[idx,] + +build_reference <- function(cl, norm.dat, dend, de.genes, cl.label=NULL, up.gene.score=NULL, down.gene.score=NULL, n.markers=30) + { + cl.dat = get_cl_means(norm.dat, cl) + if(is.null(up.gene.score)){ + de.gene.score = get_gene_score(de.genes) + up.gene.score = de.gene.score[[1]] + down.gene.score = de.gene.score[[2]] + } + select.genes = intersect(row.names(norm.dat), row.names(up.gene.score)) + dend = select_dend_markers(dend, norm.dat=norm.dat, cl=cl, de.genes=de.genes, + up.gene.score=up.gene.score[select.genes,], + down.gene.score=down.gene.score[select.genes,], n.markers=n.markers) + dend = select_pos_dend_markers(dend= dend, norm.dat = norm.dat, cl = cl) + if(!is.null(cl.label)){ + colnames(cl.dat) = cl.label[colnames(cl.dat)] + labels(dend) = cl.label[labels(dend)] + } + dend = label_dend(dend)[[1]] + return(list(cl.dat=cl.dat, dend=dend)) + } + + +map_reference_tree <- function(cl.dat, dend, map.dat, map.cells=colnames(map.dat), mc.cores=10, bs.num=100, p=0.7, low.th=0.15) + { +###Assume map.dat is logCPM already + memb = map_dend_membership(dend, cl.dat, map.dat=map.dat, map.cells, mc.cores=mc.cores, bs.num=100, p=0.7, low.th=0.15) + map.df = summarize_cl(dend, memb, map.dat, conf.th=0.7, min.genes=1, min.genes.ratio=0.3) - ### Some more initializations - query.dat.cells = colnames(query.dat.norm) - cl.med = get_cl_means(norm.dat, cl) - rownames(cl.med)=rownames(norm.dat) + Tree_mapping_probability = compute_mapping_probability(memb = FACS.memb, + select.cells = FACS.cells, + select.cl = select.cl, + ref.cl= cl) - # The key algorithm : Run 100 iterations, in each one sample 70% of the cells. - # low.th is the minimum differnce in Pearson correlation required to decide on which branch to map to. If the difference - # is lower than this threshold, a random branch is chosen. - # The resulted memb object is a matrix where every row is a cell, and columns are the nodes of the dendrogram. The values are the bootstrap support for that node. - memb = map_dend_membership(dend, cl,cl.med, norm.dat, query.dat.norm, query.dat.cells, mc.cores=mc.cores, bs.num=bs.num, p=p, low.th=low.th) - # analyze the results to generate the final output, i.e. for every cell the deepest node with th=0.8 confidence. - # Also apply constraints on the minimum number of genes (or genes ratio) - mapping.df = summarize_cl(dend, memb, query.dat.norm, conf.th=conf.th, min.genes=min.genes, min.genes.ratio=min.genes.ratio) - # save results - save(mapping.df, file=file.path(paste0("mapping.df.rda"))) - save(memb, file=file.path(paste0("mapping.memb.rda"))) - write.csv(mapping.df, file=file.path(paste0("mapping.df.csv"))) - write.csv(memb, file=file.path( paste0("mapping.memb.csv"))) - return (list(memb, mapping.df)) + return(list(memb, map.df)) } + + diff --git a/R/markers.R b/R/markers.R index 486663b..21e8bb8 100644 --- a/R/markers.R +++ b/R/markers.R @@ -34,7 +34,12 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1, select.genes },simplify=F) },mc.cores=mc.cores) - markers = intersect(unlist(de.markers),row.names(norm.dat)) + if(!is.null(norm.dat)){ + markers = intersect(unlist(de.markers),row.names(norm.dat)) + } + else{ + markers = unique(unlist(de.markers)) + } return(list(markers=markers, de.genes=de.genes)) } From 095fb865580f9b139cbbf6975c2cd0127b0a089f Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 30 Mar 2021 16:50:00 -0700 Subject: [PATCH 44/70] bug fix for harmonize function --- R/harmonize.R | 13 ++++++------- R/harmonize_merge.R | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index ad27ca1..1731bc0 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -155,7 +155,7 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) } else { registerDoMC(cores=mc.cores) - on.exit(parallel::stopCluster(), add = TRUE) + #on.exit(parallel::stopCluster(), add = TRUE) } bins = split(x, floor((1:length(x))/batch.size)) results= foreach(i=1:length(bins), .combine=.combine) %dopar% FUN(bins[[i]],...) @@ -248,7 +248,7 @@ get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,BINDEX=NULL, BNPARA #' #' @examples select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all.cells, maxGenes=2000, vg.padj.th=0.5, max.dim=20,use.markers=TRUE, top.n=100,rm.eigen=NULL, rm.th=rep(0.7, ncol(rm.eigen))) - { + { select.genes.list = list() for(ref.set in names(ref.list)){ #print(ref.set) @@ -258,7 +258,7 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all if(use.markers & !is.null(comb.dat$de.genes.list[[ref.set]])){ cl = droplevels(comb.dat$cl.list[[ref.set]][ref.cells]) cl.size = table(cl) - cl = droplevels(cl[cl %in% names(cl.size)[cl.size > de.param.list[[ref.set]]$min.cells]]) + cl = droplevels(cl[cl %in% names(cl.size)[cl.size > comb.dat$de.param.list[[ref.set]]$min.cells]]) if(length(levels(cl)) <= 1){ return(NULL) } @@ -441,9 +441,8 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= if(length(cl) < nrow(result$knn)){ diff.cells = setdiff(row.names(result$knn), names(cl)) pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl )$pred.df - pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) - cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) - + pred.cl= setNames(as.character(pred.df$pred.target), row.names(pred.df)) + cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) } cl.platform.counts = table(meta.df[names(cl), "platform"],cl) print(cl.platform.counts) @@ -459,7 +458,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= tmp.cells = names(cl)[cl %in% bad.cl] ##########FIX BUG pred.df = predict_knn(result$knn[tmp.cells,,drop=F], all.cells, cl)$pred.df - pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) + pred.cl= setNames(as.character(pred.df$pred.target), row.names(pred.df)) cl[names(pred.cl)]= pred.cl } merge.dat.list = comb.dat$dat.list[merge.sets] diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index a497a7a..de00f9a 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -353,7 +353,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if(length(query.cells)==0){next} ref.cells =cl.big.cells.byplatform[[set]] ref.cells = sample_cells(cl[ref.cells],300) - dat = t(merge.dat.list[[set]][anchor.genes, c(ref.cells, query.cells),drop=F]) + dat = Matrix::t(merge.dat.list[[set]][anchor.genes, c(ref.cells, query.cells),drop=F]) pred.result = predict_knn(knn.idx=NULL, reference = ref.cells, target=cl, k=min(15, ceiling(length(ref.cells)/2)), train.dat = dat[ref.cells,,drop=F], test.dat = dat[query.cells,,drop=F]) tmp.cl = with(pred.result$pred.df, setNames(pred.target, row.names(pred.result$pred.df))) print(tmp.cl) From 410d0bbf46a29445f145bac714c89e58ee3ce8aa Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Fri, 30 Apr 2021 02:26:49 -0400 Subject: [PATCH 45/70] bug fix for imputation --- R/annotate.R | 7 ++- R/consensusCluster.R | 56 ++++++++++------- R/harmonize.R | 142 ++++++++++++++++++++++++++++++------------- R/harmonize_impute.R | 27 ++++---- R/harmonize_merge.R | 4 ++ R/harmonize_util.R | 2 +- src/impute.cpp | 79 ++++++++---------------- 7 files changed, 183 insertions(+), 134 deletions(-) diff --git a/R/annotate.R b/R/annotate.R index 76f5209..80680ef 100644 --- a/R/annotate.R +++ b/R/annotate.R @@ -425,7 +425,12 @@ compare_annotate <- function(cl, if(reorder){ tmp <- apply(tb, 1, which.max) cl_names <- names(cl) - cl <- factor(as.character(cl), levels = c(row.names(tb)[order(tmp)], absent.cl)) + if(do.droplevels){ + cl <- factor(as.character(cl), levels = c(row.names(tb)[order(tmp)], absent.cl)) + } + else{ + cl <- factor(as.character(cl), levels = row.names(tb)[order(tmp)]) + } cl <- setNames(cl, cl_names) if(rename){ cl.id.map <- data.frame(new = 1:length(levels(cl)), diff --git a/R/consensusCluster.R b/R/consensusCluster.R index 6ae24f0..cdf77f1 100644 --- a/R/consensusCluster.R +++ b/R/consensusCluster.R @@ -1,3 +1,35 @@ +run_iter_clust_merge <- function(norm.dat, iter, output_dir="subsample_result", all.cells=colnames(norm.dat), prefix="all", de.param=de_param(), merge.type="undirectional", sample.frac = 0.8, init.result=NULL, mc.cores=1, override=FALSE) + { + run <- function(i,...){ + prefix = paste("iter",i,sep=".") + print(prefix) + library(Matrix) + outfile= file.path(output_dir, paste0("result.",i,".rda")) + if(file.exists(outfile)& !override){ + return(NULL) + } + select.cells=sample(all.cells, round(length(all.cells)*sample.frac)) + save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) + + result <- scrattch.hicat::iter_clust_merge(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) + save(result, file=outfile) + } + if(!dir.exists(output_dir)){ + dir.create(output_dir) + } + if (mc.cores==1){ + sapply(iter, function(i){run(i,...)}) + } + else{ + require(doMC) + require(foreach) + registerDoMC(cores=mc.cores) + foreach::foreach(i=iter,.packages=c("scrattch.hicat","Matrix"), .combine='c') %dopar% { run(i) } + } + } + + + #' Collect co-clustering matrix from results files #' #' @param result.files A directory containing results files @@ -515,30 +547,8 @@ run_consensus_clust <- function(norm.dat, if(!is.null(init.result)){ all.cells= intersect(all.cells, names(init.result$cl)) } - run <- function(i,...){ - prefix = paste("iter",i,sep=".") - print(prefix) - library(Matrix) - outfile= file.path(output_dir, paste0("result.",i,".rda")) - if(file.exists(outfile)& !override){ - return(NULL) - } - select.cells=sample(all.cells, round(length(all.cells)*sample.frac)) - save(select.cells, file=file.path(output_dir, paste0("cells.",i,".rda"))) - - result <- scrattch.hicat::iter_clust_merge(norm.dat=norm.dat, select.cells=select.cells,prefix=prefix, de.param = de.param, merge.type=merge.type, result=init.result, ...) - save(result, file=outfile) - } if(is.null(co.result)){ - if (mc.cores==1){ - sapply(1:niter, function(i){run(i,...)}) - } - else{ - require(doMC) - require(foreach) - registerDoMC(cores=mc.cores) - foreach::foreach(i=1:niter,.packages=c("scrattch.hicat","Matrix"), .combine='c') %dopar% { run(i) } - } + tmp=run_iter_clust_merge(norm.dat=norm.dat, iter=1:niter, output_dir=output_dir, all.cells=all.cells, prefix=prefix, de.param=de.param, merge.type=merge.type, sample.frac=0.8, init.result=init.result, mc.cores=mc.cores) result.files=file.path(output_dir, dir(output_dir, "result.*.rda")) co.result <- collect_subsample_cl_matrix(norm.dat,result.files,all.cells) } diff --git a/R/harmonize.R b/R/harmonize.R index 1731bc0..bc1b295 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -180,16 +180,12 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1,...) { results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine="rbind", FUN=function(x){ - get_knn(dat=dat[,x], ref.dat=ref.dat, k=k, method=method, dim=dim,...) + get_knn(dat=dat[,x,drop=F], ref.dat=ref.dat, k=k, method=method, dim=dim,...) }) return(results) } -build_AnnoyTree <- function(ref.dat) - { - - } #' Get KNN #' @@ -203,19 +199,39 @@ build_AnnoyTree <- function(ref.dat) #' @export #' #' @examples -get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,BINDEX=NULL, BNPARAM=NULL,...) +get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transposed=TRUE) { print(method) if(method=="cor"){ - knn.index = knn_cor(ref.dat, dat,k=k) + if(transposed){ + knn.index = knn_cor(ref.dat, dat,k=k) + } + else{ + ref.dat = Matrix::t(ref.dat) + dat = Matrix::t(dat) + knn.index = knn_cor(ref.dat, dat,k=k) + } } else if(method=="RANN"){ - knn.index = RANN::nn2(t(ref.dat), t(dat), k=k)[[1]] + if(transposed){ + ref.dat = Matrix::t(ref.dat) + dat = Matrix::t(dat) + } + knn.index = RANN::nn2(ref.dat, dat, k=k)[[1]] } - else if(method=="Annoy"){ - library(BiocNeighbors) - knn.result = queryKNN(t(red.dat), t(dat),k=k, BINDEX=BINDEX, BNPARAM= BNPARAM)[[1]] + else if(method %in% c("Annoy.Euclidean", "Annoy.Angular")){ + library(BiocNeighbors) + if(is.null(index)){ + if (method=="Annoy.Euclidean"){ + distance="Euclidean" + } + else{ + distance="Angular" + } + index= buildAnnoy(ref.dat,distance=distance, transposed=transposed) + } + knn.index = queryAnnoy(X= ref.dat, query=dat, k=k, precomputed = index, transposed=transposed)[[1]] } else if(method == "CCA"){ mat3 = crossprod(ref.dat, dat) @@ -225,7 +241,12 @@ get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,BINDEX=NULL, BNPARA else{ stop(paste(method, "method unknown")) } - row.names(knn.index) = colnames(dat) + if(!transposed){ + row.names(knn.index) = row.names(dat) + } + else{ + row.names(knn.index) = colnames(dat) + } return(knn.index) } @@ -319,6 +340,13 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all } +cleanAnnoyIndex <- function(index) + { + unlink(index@path) + rm(index) + gc() + } + #' compute knn #' @@ -337,58 +365,86 @@ select_joint_genes <- function(comb.dat, ref.list, select.cells = comb.dat$all #' @export #' #' @examples -compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, method="cor", self.method="RANN", batch.size=10000, mc.cores=1) +compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, method=c("cor","Annoy.Angular"), self.method=c("RANN","Annoy.Euclidean"), batch.size=10000, mc.cores=1) { + cat("Number of select genes", length(select.genes), "\n") cat("Get knn\n") dat.list = comb.dat$dat.list ###index is the index of knn from all the cells - knn.comb = do.call("cbind",lapply(names(ref.list), function(ref.set){ + knn.list = list() + for(ref.set in names(ref.list)){ cat("Ref ", ref.set, "\n") if(length(ref.list[[ref.set]]) <= k) { ##Not enough reference points to compute k - return(NULL) + next } k.tmp = k if(length(ref.list[[ref.set]]) <= k*2) { k.tmp = round(k/2) } - ref.dat = comb.dat$dat.list[[ref.set]][select.genes, ref.list[[ref.set]],drop=F] - knn =do.call("rbind", lapply(select.sets, function(set){ + dat = dat.list[[ref.set]] + ref.cells = ref.list[[ref.set]] + map.cells= intersect(select.cells, colnames(dat)) + if(length(map.cells)==0){ + next + } + tmp.cores = mc.cores + if(ncol(dat)< batch.size) tmp.cores = 1 + rd.dat = rd_PCA(dat,select.genes=select.genes, select.cells=map.cells, max.pca = 50, sampled.cells=ref.cells, th=1, mc.cores=tmp.cores)$rd.dat + ref.rd.dat = rd.dat[ref.cells,,drop=F] + idx = match(ref.cells, comb.dat$all.cells) + if(self.method== "RANN"){ + require(RANN) + knn = RANN::nn2(ref.rd.dat , rd.dat, k=k.tmp)[[1]] + row.names(knn) = row.names(rd.dat) + } + else{ + require(BiocNeighbors) + index = buildAnnoy(ref.rd.dat, distance ="Euclidean", transposed = FALSE) + knn=get_knn_batch(dat=rd.dat, ref.dat = ref.rd.dat, k=k.tmp, method = self.method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=FALSE) + cleanAnnoyIndex(index) + } + knn = matrix(idx[knn], nrow=nrow(knn), dimnames=list(row.names(knn), NULL)) + self.knn = knn + index = NULL + ref.dat = dat[select.genes,ref.cells] + if(method %in% c("Annoy.Euclidean", "Annoy.Angular")){ + if(method=="Annoy.Angular"){ + distance = "Angular" + } + else{ + distance = "Euclidean" + } + index = buildAnnoy(ref.dat, distance =distance, transposed = TRUE) + } + knn =do.call("rbind", lapply(setdiff(select.sets,ref.set), function(set){ cat("Set ", set, "\n") map.cells= intersect(select.cells, colnames(dat.list[[set]])) if(length(map.cells)==0){ return(NULL) } dat = dat.list[[set]][select.genes,map.cells,drop=F] - if(set == ref.set & self.method =="RANN"){ - rd.dat = rd_PCA(dat,select.genes=row.names(dat), select.cells=colnames(dat), max.pca = 50, sampled.cells=colnames(ref.dat), th=1)$rd.dat - if(is.null(rd.dat)){ - return(NULL) - } - knn = RANN::nn2(rd.dat[colnames(ref.dat),,drop=F] , rd.dat[colnames(dat),,drop=F], k=k.tmp)[[1]] - row.names(knn) = colnames(dat) - } - else{ - tmp.cores = mc.cores - if(ncol(dat)< batch.size){ - tmp.cores = 1 - } - knn=get_knn_batch(dat=dat, ref.dat = ref.dat, k=k.tmp, method = method, batch.size = batch.size, mc.cores=tmp.cores) - } + tmp.cores = mc.cores + if(ncol(dat)< batch.size){ + tmp.cores = 1 + } + knn=get_knn_batch(dat=dat, ref.dat = ref.dat, k=k.tmp, method = method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=TRUE) if(!is.null(comb.dat$cl.list)){ - test.knn = test_knn(knn, comb.dat$cl.list[[set]], colnames(ref.dat), comb.dat$cl.list[[ref.set]]) - + test.knn = test_knn(knn, comb.dat$cl.list[[set]], colnames(ref.dat), comb.dat$cl.list[[ref.set]]) if(!is.null(test.knn)){ cat("Knn", set, ref.set, method, "cl.score", test.knn$cl.score, "cell.score", test.knn$cell.score,"\n") } } - idx = match(colnames(ref.dat), comb.dat$all.cells) - knn = matrix(idx[knn], nrow=nrow(knn)) - row.names(knn) = map.cells - knn - })) - })) + knn = matrix(idx[knn], nrow=nrow(knn), dimnames=list(row.names(knn), NULL)) + })) + if(!is.null(index)){ + cleanAnnoyIndex(index) + } + knn = rbind(self.knn, knn) + knn.list[[ref.set]] = knn[select.cells,] + } + knn.comb = do.call("cbind",knn.list) return(knn.comb) } @@ -431,7 +487,9 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= } knn.comb= compute_knn(comb.dat, select.genes=select.genes, ref.list=ref.list, select.sets=select.sets, select.cells=select.cells, k=k, method=method, self.method=self.method, batch.size=batch.size, mc.cores=mc.cores) - + if(is.null(knn.comb)){ + return(NULL) + } sampled.cells = unlist(cells.list) result = knn_jaccard_louvain(knn.comb[sampled.cells,]) result$cl.mat = as.matrix(t(result$memberships)) @@ -632,7 +690,7 @@ harmonize <- function(comb.dat, prefix, overwrite=TRUE, dir=".",...) #' @export #' #' @examples -i_harmonize <- function(comb.dat, select.cells=comb.dat$all.cells, ref.sets=names(comb.dat$dat.list), prefix="", result=NULL, overwrite=TRUE, ...) +i_harmonize <- function(comb.dat, select.cells=comb.dat$all.cells, ref.sets=names(comb.dat$dat.list), prefix="", result=NULL, overwrite=TRUE, split.size = 50,...) { #attach(comb.dat) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index dd994b3..1b6a0f3 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -118,7 +118,7 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose -impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=comb.dat$sets, max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) +impute_knn_global <- function(comb.dat, split.results, select.genes, select.cells, ref.list, sets=names(comb.dat$dat.list), max.dim=100, k=15, th=0.5, rm.eigen=NULL,rm.th=0.65,method="zscore",mc.cores=1,verbose=FALSE) { library(matrixStats) org.rd.dat.list <- list() @@ -146,39 +146,40 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell dat = as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells]) reference.id = 1:length(ref.cells) gene.id = 1:length(select.genes) - ImputeKnn(knn, cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[x]], transpose_input=FALSE, transpose_output=FALSE) + ImputeKnn(knn, cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[x]], transpose_input=FALSE, transpose_output=FALSE) } ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. - impute.genes=NULL for(x in names(split.results)){ print(x) result = split.results[[x]] + if(x == names(split.results)[1]){ + impute.genes = select.genes + } + else{ + impute.genes=intersect(select.genes,c(result$markers, result$select.genes)) + } cl = result$cl knn = result$knn for(ref.set in intersect(names(result$ref.list),names(ref.list))){ print(ref.set) tmp.cells = row.names(knn) - add.cells=FALSE query.cells = intersect(tmp.cells[comb.dat$meta.df[tmp.cells,"platform"] != ref.set], select.cells) - if(is.null(impute.genes)){ - impute.genes = select.genes - } - else{ - impute.genes=intersect(select.genes,c(result$markers, result$select.genes)) - } select.cols = comb.dat$meta.df[comb.dat$all.cells[knn[1,]],"platform"] == ref.set cat("Impute genes", length(impute.genes),"\n") if(sum(select.cols)==0){ next } - ref.cells = intersect(comb.dat$all.cells[unique(as.vector(knn[, select.cols]))],select.cells) - select.knn = knn[query.cells,select.cols] + if(length(query.cells)==0){ + next + } + + select.knn = knn[query.cells,select.cols,drop=F] dat = impute.dat.list[[ref.set]] gene.id = match(impute.genes, row.names(dat)) cell.id = match(query.cells, colnames(dat)) reference.id = match(comb.dat$all.cells, colnames(dat)) - ImputeKnn(select.knn,cell.id, reference.id, dat=impute.dat.list[[ref.set]], gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[ref.set]], transpose_input=FALSE, transpose_output=FALSE) + ImputeKnn(select.knn,cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=dat, transpose_input=FALSE, transpose_output=FALSE) } } return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index de00f9a..34a6f40 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -214,6 +214,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo next } include.y = length(tmp.cells2) >= merge.de.param.list[[set]]$min.cells + #update cl.means.list if(!is.null(cl.means.list)){ if(!is.null(cl.means.list[[set]])){ tmp = colnames(cl.means.list[[set]])!=x @@ -230,6 +231,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } + #update cl.sqr.means.list if(!is.null(cl.sqr.means.list) & !is.null(cl.sqr.means.list[[set]]) & de.method=="fast_limma"){ if(!is.null(cl.sqr.means.list[[set]])){ tmp = colnames(cl.sqr.means.list[[set]])!=x @@ -246,6 +248,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } + #update cl.present.list if(!is.null(cl.present.list) & !is.null(cl.present.list[[set]])){ if(!is.null(cl.present.list[[set]])){ tmp = colnames(cl.present.list[[set]])!=x @@ -262,6 +265,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo } } } + #update cluster similary matrix if(include.y){ tmp= Matrix::rowMeans(merge.dat.list[[set]][anchor.genes ,tmp.cells2,drop=FALSE]) if(y %in% colnames(cl.rd)){ diff --git a/R/harmonize_util.R b/R/harmonize_util.R index cdbeb45..c7856cc 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -103,7 +103,7 @@ plot_confusion <- function(consensus.cl, prefix, comb.dat,consensus.cl.df = NULL g.list=list() for(x in names(comb.dat$cl.list)){ if(sum(names(comb.dat$cl.list[[x]]) %in% names(consensus.cl)) > 0){ - if(is.null(cl.df)){ + if(is.null(consensus.cl.df)){ g = compare_annotate(consensus.cl, comb.dat$cl.list[[x]], comb.dat$cl.df.list[[x]], rename = FALSE, do.droplevels=do.droplevels)$g g = g + xlab("consensus cluster") + ylab(x) } diff --git a/src/impute.cpp b/src/impute.cpp index b9fd9d9..525a1f0 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -10,65 +10,36 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_ if(w_mat_.isNotNull()){ w_mat = new NumericMatrix(w_mat_); } - - if(gene_idx_.isNotNull()){ - gene_idx = new IntegerVector(gene_idx_); - *gene_idx = *gene_idx - 1; - //std::cout << gene_idx->length() << "\n"; - } + gene_idx = new IntegerVector(gene_idx_); + *gene_idx = *gene_idx - 1; + //std::cout << transpose_input <<"\t" << transpose_output <<'\n'; - for(int j=0; j < knn_idx.ncol();j++){ - for(int i=0; i < cell_idx.length(); i++){ - int cell_id = cell_idx[i]-1; - int knn_id = knn_idx(i, j)-1; - int ref_id = ref_idx[knn_id] -1; - float w = 1.0/knn_idx.ncol(); - //if(i==cell_idx.length()-1){ - //std::cout << j <<"\t"<< cell_id <<"\t"<< knn_id <<"\t" << ref_id <<"\n"; - //} - if(w_mat!=NULL){ - w = (*w_mat)(i,j); - } - if(transpose_output){ - if(gene_idx_.isNotNull()){ - for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ - if(transpose_input){ - impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + dat(ref_id,*it) * w; - } - else{ - impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + dat(*it,ref_id) * w; - } - } + for(int i=0; i < cell_idx.length(); i++){ + int cell_id = cell_idx[i]-1; + for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ + impute_dat(cell_id, *it) = 0; + for(int j=0; j < knn_idx.ncol();j++){ + int knn_id = knn_idx(i, j)-1; + int ref_id = ref_idx[knn_id] -1; + float w = 1.0/knn_idx.ncol(); + float knn_val = 0; + float val = 0; + if(w_mat!=NULL){ + w = (*w_mat)(i,j); } - else{ - if(transpose_input){ - impute_dat(cell_id,_) = impute_dat(cell_id,_) + dat(ref_id,_) * w; - } - else{ - impute_dat(cell_id,_) = impute_dat(cell_id,_) + dat(_,ref_id) * w; - } - } - } - else{ - if(gene_idx_.isNotNull()){ - for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ - if(transpose_input){ - impute_dat(*it,cell_id) = impute_dat(*it,cell_id) + dat(ref_id,*it) * w; - } - else{ - //std::cout << cell_id << "\t"<<*it << "\t" << ref_id << "\t" << dat.nrow() << "\t" << dat.ncol() << "\n"; - impute_dat(*it,cell_id) = impute_dat(*it,cell_id) + dat(*it,ref_id) * w; - } - } + if(transpose_input){ + knn_val = dat(ref_id, *it); } else{ - if(transpose_input){ - impute_dat(_,cell_id) = impute_dat(_,cell_id) + dat(ref_id,_) * w; - } - else{ - impute_dat(_,cell_id) = impute_dat(_,cell_id) + dat(_,ref_id) * w; - } + knn_val = dat(*it, ref_id); + } + + if(transpose_output){ + impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + knn_val * w; } + else{ + impute_dat(*it, cell_id) = impute_dat(*it,cell_id) + knn_val * w; + } } } } From 765fb938a940ef4af124c11fbdce178dcee1dd91 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 4 May 2021 14:20:54 -0400 Subject: [PATCH 46/70] Bug fix for imputation --- R/harmonize_impute.R | 38 ++++++++++++------- R/harmonize_util.R | 31 +++++++++++++++- R/markers.R | 13 +++++-- src/impute.cpp | 87 +++++++++++++++++++++++++++++++++----------- 4 files changed, 129 insertions(+), 40 deletions(-) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 1b6a0f3..4049db0 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -87,9 +87,9 @@ predict_knn <- function(knn.idx, reference, target, k=15, train.dat=NULL, test.d #' @export #' #' @examples -impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose_input=FALSE, transpose_output= FALSE) +impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose_input=FALSE, transpose_output= FALSE, mc.cores=1) { - cell.id = 1:nrow(knn.idx) + if(transpose_input){ reference.id = match(reference, row.names(dat)) genes = colnames(dat) @@ -100,18 +100,27 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose } if(transpose_output){ - impute.dat = matrix(0,length(cell.id), length(genes)) + impute.dat = matrix(0,nrow(knn.idx), length(genes)) row.names(impute.dat) = row.names(knn.idx) colnames(impute.dat) = genes } else{ - impute.dat = matrix(0, length(genes),length(cell.id)) + impute.dat = matrix(0, length(genes),nrow(knn.idx)) row.names(impute.dat) = genes colnames(impute.dat) = row.names(knn.idx) } - ImputeKnn(knn.idx,cell.id, reference.id, dat, gene_idx_=NULL, w_mat_= w, impute.dat, transpose_input=transpose_input, transpose_output=transpose_output) + cell.id = 1:nrow(knn.idx) + gene.id = 1:length(genes) + library(parallel) + tmp = parallel::pvec(cell.id, function(x){ + ImputeKnn(knn.idx, reference.id, x, gene.id, + dat=dat,impute.dat, w_mat_=NULL, + transpose_input=transpose_input, transpose_output=transpose_output) + },mc.cores=mc.cores) + #ImputeKnnWhole(knn.idx, reference.id, dat, impute.dat, w_mat_= NULL, + # transpose_input=transpose_input, transpose_output=transpose_output) impute.dat -} + } @@ -128,9 +137,6 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell for(x in names(ref.list)) { print(x) - impute.dat = matrix(0, nrow=length(select.genes), ncol=length(select.cells)) - dimnames(impute.dat) = list(select.genes, select.cells) - impute.dat.list[[x]] = impute.dat tmp.cells= select.cells[comb.dat$meta.df[select.cells,"platform"]==x] ref.cells = ref.list[[x]] rd.result <- rd_PCA(comb.dat$dat.list[[x]], select.genes, select.cells=tmp.cells, sampled.cells = ref.cells, max.pca =max.dim, th=th, method=method,mc.cores=mc.cores,verbose=verbose) @@ -142,13 +148,17 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell #print(ncol(rd.dat)) knn = RANN::nn2(data=rd.dat[ref.cells,],query=rd.dat,k=k)[[1]] row.names(knn) = row.names(rd.dat) - cell.id = match(row.names(rd.dat), select.cells) dat = as.matrix(comb.dat$dat.list[[x]][select.genes,ref.cells]) reference.id = 1:length(ref.cells) + cell.id = match(row.names(rd.dat), select.cells) gene.id = 1:length(select.genes) - ImputeKnn(knn, cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=impute.dat.list[[x]], transpose_input=FALSE, transpose_output=FALSE) + impute.dat = matrix(0, nrow=length(select.genes), ncol=length(select.cells)) + dimnames(impute.dat) = list(select.genes, select.cells) + ImputeKnn(knn, reference.id, cell.id, gene.id, dat=dat, impute.dat, w_mat_ = NULL, + transpose_input=FALSE, transpose_output=FALSE); + impute.dat.list[[x]] = impute.dat } - + ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. for(x in names(split.results)){ print(x) @@ -179,7 +189,9 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell gene.id = match(impute.genes, row.names(dat)) cell.id = match(query.cells, colnames(dat)) reference.id = match(comb.dat$all.cells, colnames(dat)) - ImputeKnn(select.knn,cell.id, reference.id, dat=dat, gene_idx_=gene.id, w_mat_= NULL, impute_dat=dat, transpose_input=FALSE, transpose_output=FALSE) + ImputeKnn(select.knn, reference.id, cell.id, gene_idx=gene.id, + dat=dat,impute_dat=dat, w_mat_= NULL, + transpose_input=FALSE, transpose_output=FALSE) } } return(list(knn.list =knn.list, org.rd.dat.list = org.rd.dat.list,impute.dat.list=impute.dat.list, ref.list=ref.list)) diff --git a/R/harmonize_util.R b/R/harmonize_util.R index c7856cc..6920b8a 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -556,7 +556,7 @@ gene_gene_cor_conservation <- function(dat.list, select.genes, select.cells,pair #' @export #' #' @examples -plot_markers <- function(dat.list, cl, de.param.list,prefix, common.genes, comb.de.genes=NULL, cl.means.list=NULL, col.list=NULL, cl.col=NULL, select.genes=NULL, save.matrix=FALSE,n.markers = 20,...) +plot_markers <- function(dat.list, cl, de.param.list,prefix, common.genes, comb.de.genes=NULL, ref.set=names(dat.list)[[1]], cl.means.list=NULL, col.list=NULL, cl.col=NULL, select.genes=NULL, save.matrix=FALSE,n.markers = 20,...) { sets=names(dat.list) jet.colors <-colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan","#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) @@ -583,7 +583,7 @@ plot_markers <- function(dat.list, cl, de.param.list,prefix, common.genes, comb } select.genes = select_markers(dat.list[[1]], cl, n.markers=n.markers, de.genes=comb.de.genes)$markers } - gene.hc = hclust(dist(cl.means.list[[1]][select.genes,]), method="ward.D") + gene.hc = hclust(dist(cl.means.list[[ref.set]][select.genes,]), method="ward.D") if(is.null(cl.col)){ cl.col = jet.colors(length(unique(cl))) } @@ -616,3 +616,30 @@ plot_markers <- function(dat.list, cl, de.param.list,prefix, common.genes, comb return(list(select.genes=select.genes, dat.matrix = dat.matrix, comb.de.genes= comb.de.genes,gene.hc=gene.hc)) } + + +get_incident_matrix <- function(cl1, cl2, consensus.cl,pseudo=0.01) +{ + tb1 = table(cl1, consensus.cl[names(cl1)]) + pseudo + freq1 = as.matrix(tb1/rowSums(tb1)) + tb2 = table(cl2, consensus.cl[names(cl2)]) + pseudo + freq2 = as.matrix(tb2/rowSums(tb2)) + kl = matrix(0, nrow=nrow(freq1), ncol=nrow(freq2)) + row.names(kl) = row.names(freq1) + colnames(kl) = row.names(freq2) + library(entropy) + for(i in 1:nrow(freq1)) + for(j in 1:nrow(freq2)){ + kl[i,j] = KL.plugin(freq1[i,], freq2[j,]) + } + + kl.exp = exp(-kl) + kl.sim = kl.exp/rowSums(kl.exp) + + pairs.df = melt(kl) + colnames(pairs.df)=c("cl1","cl2","KL") + pairs.df$sim = as.vector(kl.sim) + return(list(kl, kl.sim,pairs.df)) +} + + diff --git a/R/markers.R b/R/markers.R index 21e8bb8..c592ea8 100644 --- a/R/markers.R +++ b/R/markers.R @@ -322,14 +322,21 @@ select_markers_pair_group<- function(cl, g1,g2,de.genes,cl.means, top.n=50,max.n #' @export #' #' @examples -select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.score=NULL, default.markers=NULL, pair.num =1, add.up=pair.num, add.down=pair.num, rm.genes=NULL, pairs=names(de.genes)) +select_N_markers <- function(de.genes, cl.means, up.gene.score=NULL, down.gene.score=NULL, default.markers=NULL, pair.num =1, add.up=pair.num, add.down=pair.num, rm.genes=NULL, pairs=names(de.genes), mc.cores=20) { add.up = setNames(rep(add.up, length(pairs)), pairs) add.down= setNames(rep(add.down, length(pairs)), pairs) up.default = down.default = c() if(!is.null(default.markers)){ - up.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) - down.default = sapply(pairs, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) + library(parallel) + up.default = parallel::pvec(pairs, function(x){ + g.list=sapply(x, function(p){intersect(names(de.genes[[p]]$up.genes), default.markers)},simplify=F) + },mc.cores=mc.cores) + + down.default = parallel::pvec(pairs, function(x){ + g.list=sapply(x, function(p){intersect(names(de.genes[[p]]$down.genes), default.markers)},simplify=F) + },mc.cores=mc.cores) + add.up = pmax(add.up - sapply(up.default, length),0) add.down = pmax(add.down - sapply(down.default, length),0) } diff --git a/src/impute.cpp b/src/impute.cpp index 525a1f0..1c18bd8 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -2,45 +2,88 @@ using namespace Rcpp; // [[Rcpp::export]] -void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_idx, NumericMatrix dat, Nullable gene_idx_, Nullable w_mat_, NumericMatrix impute_dat,bool transpose_input, bool transpose_output) +void ImputeKnn(IntegerMatrix knn_idx, IntegerVector ref_idx, IntegerVector cell_idx, IntegerVector gene_idx, NumericMatrix dat, NumericMatrix impute_dat,Nullable w_mat_, bool transpose_input, bool transpose_output) { - NumericMatrix* w_mat = NULL; - IntegerVector* gene_idx=NULL; + float w = 1.0/knn_idx.ncol(); if(w_mat_.isNotNull()){ w_mat = new NumericMatrix(w_mat_); } - gene_idx = new IntegerVector(gene_idx_); - *gene_idx = *gene_idx - 1; - //std::cout << transpose_input <<"\t" << transpose_output <<'\n'; + //gene_idx = gene_idx - 1; + //knn_idx = knn_idx - 1; + //ref_idx = ref_idx - 1; + //cell_idx = cell_idx - 1; + + for(int i=0; i < cell_idx.length(); i++){ - int cell_id = cell_idx[i]-1; - for(IntegerVector::iterator it = gene_idx->begin(); it!=gene_idx->end(); it++){ - impute_dat(cell_id, *it) = 0; - for(int j=0; j < knn_idx.ncol();j++){ - int knn_id = knn_idx(i, j)-1; - int ref_id = ref_idx[knn_id] -1; - float w = 1.0/knn_idx.ncol(); + int cell_id = cell_idx[i] - 1; + for(int j=0; j < knn_idx.ncol();j++){ + int knn_id = knn_idx(i, j) - 1; + int ref_id = ref_idx[knn_id] -1 ; + if(w_mat!=NULL){ + w = (*w_mat)(i,j); + } + for(IntegerVector::iterator g = gene_idx.begin(); g!=gene_idx.end(); g++){ + //Reset impute value to be zero. + int g_id = *g - 1; + if(j==0){ + if(transpose_output){ + impute_dat(cell_id, g_id) = 0; + } + else{ + impute_dat(g_id, cell_id) = 0; + } + } float knn_val = 0; - float val = 0; - if(w_mat!=NULL){ - w = (*w_mat)(i,j); - } if(transpose_input){ - knn_val = dat(ref_id, *it); + knn_val = dat(ref_id, g_id); } else{ - knn_val = dat(*it, ref_id); + knn_val = dat(g_id, ref_id); } - if(transpose_output){ - impute_dat(cell_id,*it) = impute_dat(cell_id,*it) + knn_val * w; + impute_dat(cell_id, g_id) = impute_dat(cell_id,g_id) + knn_val * w; } else{ - impute_dat(*it, cell_id) = impute_dat(*it,cell_id) + knn_val * w; + impute_dat(g_id, cell_id) = impute_dat(g_id,cell_id) + knn_val * w; } } } } } + +//Assume dat and impute_dat have the same number of features. +// [[Rcpp::export]] +void ImputeKnnWhole(IntegerMatrix knn_idx, IntegerVector ref_idx, NumericMatrix dat, NumericMatrix impute_dat,Nullable w_mat_, bool transpose_input, bool transpose_output) +{ + float w = 1.0/knn_idx.ncol(); + NumericMatrix* w_mat = NULL; + if(w_mat_.isNotNull()){ + w_mat = new NumericMatrix(w_mat_); + } + knn_idx = knn_idx - 1; + ref_idx = ref_idx - 1; + for(int j=0; j < knn_idx.ncol();j++){ + IntegerVector ref_id=ref_idx[knn_idx(_, j)]; + for(int i =0; i < ref_id.length(); i++){ + NumericVector knn_val; + int k = ref_id[i]; + if(transpose_input){ + knn_val = dat(k, _); + } + else{ + knn_val = dat(_, k); + } + if(w_mat!=NULL){ + w = (*w_mat)(i,j); + } + if(transpose_output){ + impute_dat(i,_) = impute_dat(i,_) + knn_val * w; + } + else{ + impute_dat(_,i) = impute_dat(_,i) + knn_val * w; + } + } + } +} From 9f67b7f52dff873df25d71687f5cec1d1b651a4a Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 4 May 2021 14:31:18 -0400 Subject: [PATCH 47/70] Remove unused function --- src/impute.cpp | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/impute.cpp b/src/impute.cpp index 1c18bd8..c259539 100644 --- a/src/impute.cpp +++ b/src/impute.cpp @@ -53,37 +53,3 @@ void ImputeKnn(IntegerMatrix knn_idx, IntegerVector ref_idx, IntegerVector cell_ } } -//Assume dat and impute_dat have the same number of features. -// [[Rcpp::export]] -void ImputeKnnWhole(IntegerMatrix knn_idx, IntegerVector ref_idx, NumericMatrix dat, NumericMatrix impute_dat,Nullable w_mat_, bool transpose_input, bool transpose_output) -{ - float w = 1.0/knn_idx.ncol(); - NumericMatrix* w_mat = NULL; - if(w_mat_.isNotNull()){ - w_mat = new NumericMatrix(w_mat_); - } - knn_idx = knn_idx - 1; - ref_idx = ref_idx - 1; - for(int j=0; j < knn_idx.ncol();j++){ - IntegerVector ref_id=ref_idx[knn_idx(_, j)]; - for(int i =0; i < ref_id.length(); i++){ - NumericVector knn_val; - int k = ref_id[i]; - if(transpose_input){ - knn_val = dat(k, _); - } - else{ - knn_val = dat(_, k); - } - if(w_mat!=NULL){ - w = (*w_mat)(i,j); - } - if(transpose_output){ - impute_dat(i,_) = impute_dat(i,_) + knn_val * w; - } - else{ - impute_dat(_,i) = impute_dat(_,i) + knn_val * w; - } - } - } -} From 66b4d371273cdae9f15406b6ca272d9ce9633072 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 4 May 2021 15:49:08 -0400 Subject: [PATCH 48/70] Modify ImputeKnn arguments --- R/RcppExports.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/RcppExports.R b/R/RcppExports.R index b2b917f..528b3f3 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -2,7 +2,8 @@ # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 -ImputeKnn <- function(knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output) { - invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output)) +ImputeKnn <- function(knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output) { + invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', + knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output)) } From 346c8a4c377fdb85a052b217eb0451ef1fa9d05d Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 4 May 2021 18:03:05 -0400 Subject: [PATCH 49/70] Update RcppExport --- DESCRIPTION | 1 + R/RcppExports.R | 6 ++---- src/RcppExports.cpp | 12 ++++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 0c32c01..17cd84d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,6 +20,7 @@ RoxygenNote: 7.0.2 Requires: Matrix,Rphenograph, Imports: Rcpp, + BiocNeighbors, RcppAnnoy, parallel, doMC, diff --git a/R/RcppExports.R b/R/RcppExports.R index 528b3f3..bf776d8 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,9 +1,7 @@ # Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -ImputeKnn <- function(knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output) { - invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', - knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output)) +ImputeKnn <- function(knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output) { + invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output)) } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 771a5e2..76df922 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -6,20 +6,20 @@ using namespace Rcpp; // ImputeKnn -void ImputeKnn(IntegerMatrix knn_idx, IntegerVector cell_idx, IntegerVector ref_idx, NumericMatrix dat, Nullable gene_idx_, Nullable w_mat_, NumericMatrix impute_dat, bool transpose_input, bool transpose_output); -RcppExport SEXP _scrattch_hicat_ImputeKnn(SEXP knn_idxSEXP, SEXP cell_idxSEXP, SEXP ref_idxSEXP, SEXP datSEXP, SEXP gene_idx_SEXP, SEXP w_mat_SEXP, SEXP impute_datSEXP, SEXP transpose_inputSEXP, SEXP transpose_outputSEXP) { +void ImputeKnn(IntegerMatrix knn_idx, IntegerVector ref_idx, IntegerVector cell_idx, IntegerVector gene_idx, NumericMatrix dat, NumericMatrix impute_dat, Nullable w_mat_, bool transpose_input, bool transpose_output); +RcppExport SEXP _scrattch_hicat_ImputeKnn(SEXP knn_idxSEXP, SEXP ref_idxSEXP, SEXP cell_idxSEXP, SEXP gene_idxSEXP, SEXP datSEXP, SEXP impute_datSEXP, SEXP w_mat_SEXP, SEXP transpose_inputSEXP, SEXP transpose_outputSEXP) { BEGIN_RCPP Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< IntegerMatrix >::type knn_idx(knn_idxSEXP); - Rcpp::traits::input_parameter< IntegerVector >::type cell_idx(cell_idxSEXP); Rcpp::traits::input_parameter< IntegerVector >::type ref_idx(ref_idxSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type cell_idx(cell_idxSEXP); + Rcpp::traits::input_parameter< IntegerVector >::type gene_idx(gene_idxSEXP); Rcpp::traits::input_parameter< NumericMatrix >::type dat(datSEXP); - Rcpp::traits::input_parameter< Nullable >::type gene_idx_(gene_idx_SEXP); - Rcpp::traits::input_parameter< Nullable >::type w_mat_(w_mat_SEXP); Rcpp::traits::input_parameter< NumericMatrix >::type impute_dat(impute_datSEXP); + Rcpp::traits::input_parameter< Nullable >::type w_mat_(w_mat_SEXP); Rcpp::traits::input_parameter< bool >::type transpose_input(transpose_inputSEXP); Rcpp::traits::input_parameter< bool >::type transpose_output(transpose_outputSEXP); - ImputeKnn(knn_idx, cell_idx, ref_idx, dat, gene_idx_, w_mat_, impute_dat, transpose_input, transpose_output); + ImputeKnn(knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output); return R_NilValue; END_RCPP } From 8744012e6e8feac9369b419443aab4c34bf41570 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Mon, 10 May 2021 22:21:09 -0400 Subject: [PATCH 50/70] control the number of cores to use based on the job size --- R/harmonize.R | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index bc1b295..bd8bc10 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -179,8 +179,8 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) #' @examples get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1,...) { - results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine="rbind", FUN=function(x){ - get_knn(dat=dat[,x,drop=F], ref.dat=ref.dat, k=k, method=method, dim=dim,...) + results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine="rbind", FUN=function(bin){ + get_knn(dat=dat[,bin,drop=F], ref.dat=ref.dat, k=k, method=method, dim=dim,...) }) return(results) } @@ -390,7 +390,9 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb next } tmp.cores = mc.cores - if(ncol(dat)< batch.size) tmp.cores = 1 + if(length(map.cells)< batch.size){ + tmp.cores = 1 + } rd.dat = rd_PCA(dat,select.genes=select.genes, select.cells=map.cells, max.pca = 50, sampled.cells=ref.cells, th=1, mc.cores=tmp.cores)$rd.dat ref.rd.dat = rd.dat[ref.cells,,drop=F] idx = match(ref.cells, comb.dat$all.cells) @@ -478,6 +480,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= cells.list = split(select.cells, meta.df[select.cells, "platform"])[select.sets] cells.list = sample_sets_list(cells.list, cl.list[names(cl.list) %in% select.sets], sample.size=sample.size, cl.sample.size = cl.sample.size) ref.list = cells.list[ref.sets] + ###Select genes for joint analysis if(is.null(select.genes)){ select.genes = select_joint_genes(comb.dat, ref.list = ref.list,select.cells=select.cells, ...) @@ -1005,3 +1008,4 @@ build_dend_harmonize <- function(impute.dat.list, cl, cl.df, ncores=1) l.color = setNames(as.character(cl.df$cluster_color), row.names(cl.df)) dend.result = build_dend(cl.means, l.rank = l.rank, l.color = l.color, nboot=100,ncores=ncores) } + From be8da66fa2d920fc945aba917114eb4ffe43b7ee Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 11 May 2021 15:41:18 -0400 Subject: [PATCH 51/70] re-implement predict_knn --- NAMESPACE | 1 + R/harmonize_impute.R | 99 +++++++++++++++++--------------------------- 2 files changed, 39 insertions(+), 61 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index ec2f46c..df46869 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,5 @@ useDynLib(scrattch.hicat) importFrom(Rcpp, sourceCpp) +importFrom(Rcpp, evalCpp) exportPattern("^[[:alpha:]]+") diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 4049db0..7d1d0fa 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -18,58 +18,40 @@ get_knn_weight <- function(knn.dist, scale=0.2, exclude.th = 0.0001) return(w) } -#' Title -#' -#' @param knn.idx -#' @param reference -#' @param cl -#' -#' @return -#' @export -#' -#' @examples -predict_knn_small <- function(knn.idx, reference, cl) +##' .. content for \description{} (no empty lines) .. +##' +##' .. content for \details{} .. +##' @title +##' @param knn.idx +##' @param reference +##' @param cl +##' @return +##' @author Zizhen Yao +predict_knn <- function(knn.idx, reference, cl, mc.cores=1) { + library(matrixStats) + library(data.table) library(dplyr) + library(parallel) query = row.names(knn.idx) - df = data.frame(nn=as.vector(knn.idx), query=rep(row.names(knn.idx), ncol(knn.idx))) - df = df[!is.na(df$nn),] - df$nn.cl = cl[reference[df$nn]] - tb=with(df, table(query, nn.cl)) - nn.size = table(df$query) - tb = tb/as.vector(nn.size) - pred.cl = setNames(colnames(tb)[apply(tb, 1, which.max)], row.names(tb)) - pred.score = setNames(rowMaxs(tb), row.names(tb)) - pred.df = data.frame(pred.cl, pred.score) - return(list(pred.df=pred.df, pred.prob = tb)) - } - -#' Title -#' -#' @param knn.idx -#' @param reference -#' @param cl -#' @param ... -#' -#' @return -#' @export -#' -#' @examples -predict_knn <- function(knn.idx, reference, target, k=15, train.dat=NULL, test.dat=NULL, ...) - { - library(matrixStats) - library(dplyr) - if(is.null(knn.idx)){ - knn.idx = RANN::nn2(data=train.dat[reference,],query=test.dat,k=k)[[1]] - row.names(knn.idx) = row.names(test.dat) + results = parallel::pvec(query,function(x){ + df = data.table(nn=as.vector(knn.idx[x,,drop=F]), query=rep(x, ncol(knn.idx))) + df = df %>% filter(!is.na(nn)) + df$nn.cl = cl[reference[df$nn]] + tb = df %>% group_by(query, nn.cl) %>% summarise(n=n())%>% mutate(freq = n/sum(n)) + pred.df = tb %>% group_by(query) %>% summarize(pred.cl = nn.cl[which.max(freq)], pred.score = max(freq)) + list(pred.df = pred.df, tb=tb) + },mc.cores=mc.cores) + if(mc.cores==1){ + results = list(results) } - dat = as.matrix(get_cl_mat(target)) - result = impute_knn(knn.idx, reference, dat, transpose_input=TRUE, transpose_output=TRUE,...) - pred.target = setNames(colnames(result)[apply(result, 1, which.max)], row.names(result)) - pred.score = setNames(rowMaxs(result), row.names(result)) - pred.df = data.frame(pred.target, pred.score) - return(list(pred.df=pred.df, pred.prob=result)) + pred.df = do.call("rbind",lapply(results, function(x)x[[1]])) + pred.prob = do.call("rbind",lapply(results, function(x)x[[2]])) + pred.df = as.data.frame(pred.df) + row.names(pred.df) = pred.df$query + pred.df$query=NULL + return(list(pred.df=pred.df, pred.prob = pred.prob)) } @@ -87,7 +69,7 @@ predict_knn <- function(knn.idx, reference, target, k=15, train.dat=NULL, test.d #' @export #' #' @examples -impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose_input=FALSE, transpose_output= FALSE, mc.cores=1) +impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose_input=FALSE, transpose_output= FALSE) { if(transpose_input){ @@ -99,26 +81,21 @@ impute_knn <- function(knn.idx, reference, dat, knn.dist=NULL, w=NULL, transpose genes=row.names(dat) } - if(transpose_output){ - impute.dat = matrix(0,nrow(knn.idx), length(genes)) + cell.id = 1:nrow(knn.idx) + gene.id = 1:length(genes) + if(transpose_output){ + impute.dat = matrix(0,length(cell.id), length(genes)) row.names(impute.dat) = row.names(knn.idx) colnames(impute.dat) = genes } else{ - impute.dat = matrix(0, length(genes),nrow(knn.idx)) + impute.dat = matrix(0, length(genes),length(cell.id)) row.names(impute.dat) = genes colnames(impute.dat) = row.names(knn.idx) } - cell.id = 1:nrow(knn.idx) - gene.id = 1:length(genes) - library(parallel) - tmp = parallel::pvec(cell.id, function(x){ - ImputeKnn(knn.idx, reference.id, x, gene.id, - dat=dat,impute.dat, w_mat_=NULL, - transpose_input=transpose_input, transpose_output=transpose_output) - },mc.cores=mc.cores) - #ImputeKnnWhole(knn.idx, reference.id, dat, impute.dat, w_mat_= NULL, - # transpose_input=transpose_input, transpose_output=transpose_output) + ImputeKnn(knn.idx[x,,drop=F], reference.id, x, gene.id, + dat=dat,impute.dat, w_mat_=NULL, + transpose_input=transpose_input, transpose_output=transpose_output) impute.dat } From fe94b03d5b26e05bed8c2662dd9457c917a5f077 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 11 May 2021 15:46:35 -0400 Subject: [PATCH 52/70] increase version number --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 17cd84d..4fc86a1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.4 +Version: 1.0.5 Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), From 65b50763e404a91259e7b45b0c83a9c7cd62841b Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 11 May 2021 19:56:27 -0400 Subject: [PATCH 53/70] update predict_knn function --- R/harmonize_impute.R | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 7d1d0fa..5c90530 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -35,17 +35,17 @@ predict_knn <- function(knn.idx, reference, cl, mc.cores=1) library(dplyr) library(parallel) query = row.names(knn.idx) + if(nrow(knn.idx) < 10000){ + mc.cores=1 + } results = parallel::pvec(query,function(x){ df = data.table(nn=as.vector(knn.idx[x,,drop=F]), query=rep(x, ncol(knn.idx))) df = df %>% filter(!is.na(nn)) df$nn.cl = cl[reference[df$nn]] tb = df %>% group_by(query, nn.cl) %>% summarise(n=n())%>% mutate(freq = n/sum(n)) pred.df = tb %>% group_by(query) %>% summarize(pred.cl = nn.cl[which.max(freq)], pred.score = max(freq)) - list(pred.df = pred.df, tb=tb) + list(list(pred.df = pred.df, tb=tb)) },mc.cores=mc.cores) - if(mc.cores==1){ - results = list(results) - } pred.df = do.call("rbind",lapply(results, function(x)x[[1]])) pred.prob = do.call("rbind",lapply(results, function(x)x[[2]])) pred.df = as.data.frame(pred.df) From 70e98ee6334b2cf5aba9a83a18fb7043e279e331 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 18 May 2021 11:50:27 -0400 Subject: [PATCH 54/70] Update predict_knn function, and modify ComputeSNN function from Seurat for jaccard distance computation --- DESCRIPTION | 4 +- R/RcppExports.R | 80 +++++++ R/harmonize.R | 46 ++-- R/harmonize_merge.R | 7 +- src/Makevars | 3 + src/RcppExports.cpp | 263 ++++++++++++++++++++++ src/data_manipulation.cpp | 460 ++++++++++++++++++++++++++++++++++++++ src/data_manipulation.h | 49 ++++ src/snn.cpp | 73 ++++++ src/snn.h | 21 ++ 10 files changed, 978 insertions(+), 28 deletions(-) create mode 100644 src/Makevars create mode 100644 src/data_manipulation.cpp create mode 100644 src/data_manipulation.h create mode 100644 src/snn.cpp create mode 100644 src/snn.h diff --git a/DESCRIPTION b/DESCRIPTION index 4fc86a1..4a8afc8 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,6 +22,8 @@ Imports: Rcpp, BiocNeighbors, RcppAnnoy, + RcppEigen, + RcppProgress, parallel, doMC, foreach, @@ -34,7 +36,7 @@ Imports: matrixStats, pvclust, Rtsne -LinkingTo: Rcpp (>= 0.11.0) +LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress Suggests: WGCNA, knitr, diff --git a/R/RcppExports.R b/R/RcppExports.R index bf776d8..677c970 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,7 +1,87 @@ # Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 +RowMergeMatrices <- function(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) { + .Call('_scrattch_hicat_RowMergeMatrices', PACKAGE = 'scrattch.hicat', mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) +} + +RowMergeMatricesList <- function(mat_list, mat_rownames, all_rownames) { + .Call('_scrattch_hicat_RowMergeMatricesList', PACKAGE = 'scrattch.hicat', mat_list, mat_rownames, all_rownames) +} + +LogNorm <- function(data, scale_factor, display_progress = TRUE) { + .Call('_scrattch_hicat_LogNorm', PACKAGE = 'scrattch.hicat', data, scale_factor, display_progress) +} + +Standardize <- function(mat, display_progress = TRUE) { + .Call('_scrattch_hicat_Standardize', PACKAGE = 'scrattch.hicat', mat, display_progress) +} + +FastSparseRowScale <- function(mat, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { + .Call('_scrattch_hicat_FastSparseRowScale', PACKAGE = 'scrattch.hicat', mat, scale, center, scale_max, display_progress) +} + +FastSparseRowScaleWithKnownStats <- function(mat, mu, sigma, scale = TRUE, center = TRUE, scale_max = 10, display_progress = TRUE) { + .Call('_scrattch_hicat_FastSparseRowScaleWithKnownStats', PACKAGE = 'scrattch.hicat', mat, mu, sigma, scale, center, scale_max, display_progress) +} + +FastCov <- function(mat, center = TRUE) { + .Call('_scrattch_hicat_FastCov', PACKAGE = 'scrattch.hicat', mat, center) +} + +FastCovMats <- function(mat1, mat2, center = TRUE) { + .Call('_scrattch_hicat_FastCovMats', PACKAGE = 'scrattch.hicat', mat1, mat2, center) +} + +FastRBind <- function(mat1, mat2) { + .Call('_scrattch_hicat_FastRBind', PACKAGE = 'scrattch.hicat', mat1, mat2) +} + +SparseRowMean <- function(mat, display_progress) { + .Call('_scrattch_hicat_SparseRowMean', PACKAGE = 'scrattch.hicat', mat, display_progress) +} + +SparseRowVar2 <- function(mat, mu, display_progress) { + .Call('_scrattch_hicat_SparseRowVar2', PACKAGE = 'scrattch.hicat', mat, mu, display_progress) +} + +SparseRowVarStd <- function(mat, mu, sd, vmax, display_progress) { + .Call('_scrattch_hicat_SparseRowVarStd', PACKAGE = 'scrattch.hicat', mat, mu, sd, vmax, display_progress) +} + +FastLogVMR <- function(mat, display_progress) { + .Call('_scrattch_hicat_FastLogVMR', PACKAGE = 'scrattch.hicat', mat, display_progress) +} + +RowVar <- function(x) { + .Call('_scrattch_hicat_RowVar', PACKAGE = 'scrattch.hicat', x) +} + +SparseRowVar <- function(mat, display_progress) { + .Call('_scrattch_hicat_SparseRowVar', PACKAGE = 'scrattch.hicat', mat, display_progress) +} + +ReplaceColsC <- function(mat, col_idx, replacement) { + .Call('_scrattch_hicat_ReplaceColsC', PACKAGE = 'scrattch.hicat', mat, col_idx, replacement) +} + +GraphToNeighborHelper <- function(mat) { + .Call('_scrattch_hicat_GraphToNeighborHelper', PACKAGE = 'scrattch.hicat', mat) +} + ImputeKnn <- function(knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output) { invisible(.Call('_scrattch_hicat_ImputeKnn', PACKAGE = 'scrattch.hicat', knn_idx, ref_idx, cell_idx, gene_idx, dat, impute_dat, w_mat_, transpose_input, transpose_output)) } +ComputeSNN <- function(nn_ranked, prune) { + .Call('_scrattch_hicat_ComputeSNN', PACKAGE = 'scrattch.hicat', nn_ranked, prune) +} + +WriteEdgeFile <- function(snn, filename, display_progress) { + invisible(.Call('_scrattch_hicat_WriteEdgeFile', PACKAGE = 'scrattch.hicat', snn, filename, display_progress)) +} + +DirectSNNToFile <- function(nn_ranked, prune, display_progress, filename) { + .Call('_scrattch_hicat_DirectSNNToFile', PACKAGE = 'scrattch.hicat', nn_ranked, prune, display_progress, filename) +} + diff --git a/R/harmonize.R b/R/harmonize.R index bd8bc10..41daa3f 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -52,7 +52,7 @@ prepare_harmonize<- function(dat.list, meta.df=NULL, cl.list=NULL, cl.df.list = #' @export #' #' @examples -test_knn <- function(knn, cl, reference, ref.cl) +test_knn <- function(knn, cl, reference, ref.cl, plot=FALSE) { library(reshape) library(ggplot2) @@ -68,36 +68,32 @@ test_knn <- function(knn, cl, reference, ref.cl) return(NULL) } pred.result = predict_knn(knn, reference, ref.cl) - pred.prob = as.matrix(pred.result$pred.prob) - if(ncol(pred.prob) <= 1){ + pred.prob = pred.result$pred.prob + if(length(unique(pred.prob$nn.cl))){ return(NULL) } - cl.pred.prob=as.matrix(do.call("rbind",tapply(names(cl), cl, function(x){ - colMeans(pred.prob[x,,drop=F]) - })),ncol=ncol(pred.prob)) + pred.prob$cl = cl[pred.prob$query] + pred.prob$n = NULL + cl.pred.prob=pred.prob %>% group_by(cl,nn.cl) %>% summarize(n=sum(freq)) + cl.size = as.data.frame(table(cl)) + cl.pred.prob = cl.pred.prob %>% left_join(cl.size) %>% mutate(prob=n/Freq) + match.df = cl.pred.prob %>% group_by(cl) %>% summarize(match.cl = nn.cl[which.max(prob)], + match.score = max(prob), Freq=max(Freq)) - tmp <- apply(cl.pred.prob, 1, which.max) - cl.pred.prob = cl.pred.prob[order(tmp),] - - match.cl = setNames(tmp[as.character(cl)], names(cl)) - match_score = get_pair_matrix(pred.prob, names(match.cl), match.cl) - - cl.score = sum(apply(cl.pred.prob, 1, max))/sum(cl.pred.prob) - cell.score = mean(match_score) - tb.df = melt(cl.pred.prob) - tb.df[[1]] = factor(as.character(tb.df[[1]]), levels=row.names(cl.pred.prob)) - tb.df[[2]] = factor(as.character(tb.df[[2]]), levels=colnames(cl.pred.prob)) - colnames(tb.df) = c("cl","ref.cl", "freq") - g <- ggplot(tb.df, - aes(x = cl, y = ref.cl)) + - geom_point(aes(color = freq)) + + cl.score = mean(match.df$match.score) + cell.score = with(match.df, sum(match.score * Freq)/sum(Freq)) + + g <- ggplot(cl.pred.prob, + aes(x = cl, y = nn.cl)) + + geom_point(aes(color = prob)) + theme(axis.text.x = element_text(vjust = 0.1, hjust = 0.2, angle = 90, size = 7), axis.text.y = element_text(size = 6)) + scale_color_gradient(low = "white", high = "darkblue") + scale_size(range=c(0,3)) - return(list(cl.score=cl.score, cell.score= cell.score, cell.pred.prob = pred.prob, cl.pred.prob = cl.pred.prob, g=g)) + result=list(cl.score=cl.score, cell.score= cell.score, cell.pred.prob = pred.prob, cl.pred.prob = cl.pred.prob, g=g) + return(result) } @@ -610,11 +606,13 @@ knn_cosine <- function(ref.dat, query.dat, k = 15) #' @export #' #' @examples -knn_jaccard_louvain <- function(knn.index) +knn_jaccard_louvain <- function(knn.index, ...) { require(igraph) cat("Get jaccard\n") - sim=knn_jaccard(knn.index) + #sim=knn_jaccard(knn.index,...) + sim = ComputeSNN(knn.index,...) + rownames(sim) = colnames(sim) = row.names(knn.index) cat("Louvain clustering\n") gr <- igraph::graph.adjacency(sim, mode = "undirected", weighted = TRUE) diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 34a6f40..34cc0cc 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -357,9 +357,10 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if(length(query.cells)==0){next} ref.cells =cl.big.cells.byplatform[[set]] ref.cells = sample_cells(cl[ref.cells],300) - dat = Matrix::t(merge.dat.list[[set]][anchor.genes, c(ref.cells, query.cells),drop=F]) - pred.result = predict_knn(knn.idx=NULL, reference = ref.cells, target=cl, k=min(15, ceiling(length(ref.cells)/2)), train.dat = dat[ref.cells,,drop=F], test.dat = dat[query.cells,,drop=F]) - tmp.cl = with(pred.result$pred.df, setNames(pred.target, row.names(pred.result$pred.df))) + dat = merge.dat.list[[set]][anchor.genes, c(ref.cells, query.cells),drop=F] + knn.idx = get_knn(dat[,query.cells,drop=F], dat[,ref.cells,drop=F], method="Annoy.Euclidean", k=min(15, ceiling(length(ref.cells)/2))) + pred.result = predict_knn(knn.idx=knn.idx, reference = ref.cells, cl=cl) + tmp.cl = with(pred.result$pred.df, setNames(pred.cl, row.names(pred.result$pred.df))) print(tmp.cl) cl[names(tmp.cl)] = tmp.cl } diff --git a/src/Makevars b/src/Makevars new file mode 100644 index 0000000..467628d --- /dev/null +++ b/src/Makevars @@ -0,0 +1,3 @@ +## Use the R_HOME indirection to support ## installations of multiple R version ## +## NB: No longer needed, see below +PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` \ No newline at end of file diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 76df922..5a7beae 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -2,9 +2,214 @@ // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 #include +#include using namespace Rcpp; +// RowMergeMatrices +Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); +RcppExport SEXP _scrattch_hicat_RowMergeMatrices(SEXP mat1SEXP, SEXP mat2SEXP, SEXP mat1_rownamesSEXP, SEXP mat2_rownamesSEXP, SEXP all_rownamesSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat1(mat1SEXP); + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat2(mat2SEXP); + Rcpp::traits::input_parameter< std::vector< std::string > >::type mat1_rownames(mat1_rownamesSEXP); + Rcpp::traits::input_parameter< std::vector< std::string > >::type mat2_rownames(mat2_rownamesSEXP); + Rcpp::traits::input_parameter< std::vector< std::string > >::type all_rownames(all_rownamesSEXP); + rcpp_result_gen = Rcpp::wrap(RowMergeMatrices(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames)); + return rcpp_result_gen; +END_RCPP +} +// RowMergeMatricesList +Eigen::SparseMatrix RowMergeMatricesList(List mat_list, List mat_rownames, std::vector< std::string > all_rownames); +RcppExport SEXP _scrattch_hicat_RowMergeMatricesList(SEXP mat_listSEXP, SEXP mat_rownamesSEXP, SEXP all_rownamesSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< List >::type mat_list(mat_listSEXP); + Rcpp::traits::input_parameter< List >::type mat_rownames(mat_rownamesSEXP); + Rcpp::traits::input_parameter< std::vector< std::string > >::type all_rownames(all_rownamesSEXP); + rcpp_result_gen = Rcpp::wrap(RowMergeMatricesList(mat_list, mat_rownames, all_rownames)); + return rcpp_result_gen; +END_RCPP +} +// LogNorm +Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress); +RcppExport SEXP _scrattch_hicat_LogNorm(SEXP dataSEXP, SEXP scale_factorSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type data(dataSEXP); + Rcpp::traits::input_parameter< int >::type scale_factor(scale_factorSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(LogNorm(data, scale_factor, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// Standardize +NumericMatrix Standardize(Eigen::Map mat, bool display_progress); +RcppExport SEXP _scrattch_hicat_Standardize(SEXP matSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::Map >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(Standardize(mat, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// FastSparseRowScale +Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, double scale_max, bool display_progress); +RcppExport SEXP _scrattch_hicat_FastSparseRowScale(SEXP matSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); + Rcpp::traits::input_parameter< bool >::type center(centerSEXP); + Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(FastSparseRowScale(mat, scale, center, scale_max, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// FastSparseRowScaleWithKnownStats +Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale, bool center, double scale_max, bool display_progress); +RcppExport SEXP _scrattch_hicat_FastSparseRowScaleWithKnownStats(SEXP matSEXP, SEXP muSEXP, SEXP sigmaSEXP, SEXP scaleSEXP, SEXP centerSEXP, SEXP scale_maxSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); + Rcpp::traits::input_parameter< NumericVector >::type sigma(sigmaSEXP); + Rcpp::traits::input_parameter< bool >::type scale(scaleSEXP); + Rcpp::traits::input_parameter< bool >::type center(centerSEXP); + Rcpp::traits::input_parameter< double >::type scale_max(scale_maxSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(FastSparseRowScaleWithKnownStats(mat, mu, sigma, scale, center, scale_max, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// FastCov +Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); +RcppExport SEXP _scrattch_hicat_FastCov(SEXP matSEXP, SEXP centerSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type center(centerSEXP); + rcpp_result_gen = Rcpp::wrap(FastCov(mat, center)); + return rcpp_result_gen; +END_RCPP +} +// FastCovMats +Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); +RcppExport SEXP _scrattch_hicat_FastCovMats(SEXP mat1SEXP, SEXP mat2SEXP, SEXP centerSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); + Rcpp::traits::input_parameter< bool >::type center(centerSEXP); + rcpp_result_gen = Rcpp::wrap(FastCovMats(mat1, mat2, center)); + return rcpp_result_gen; +END_RCPP +} +// FastRBind +Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); +RcppExport SEXP _scrattch_hicat_FastRBind(SEXP mat1SEXP, SEXP mat2SEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat1(mat1SEXP); + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type mat2(mat2SEXP); + rcpp_result_gen = Rcpp::wrap(FastRBind(mat1, mat2)); + return rcpp_result_gen; +END_RCPP +} +// SparseRowMean +Eigen::VectorXd SparseRowMean(Eigen::SparseMatrix mat, bool display_progress); +RcppExport SEXP _scrattch_hicat_SparseRowMean(SEXP matSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(SparseRowMean(mat, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// SparseRowVar2 +NumericVector SparseRowVar2(Eigen::SparseMatrix mat, NumericVector mu, bool display_progress); +RcppExport SEXP _scrattch_hicat_SparseRowVar2(SEXP matSEXP, SEXP muSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(SparseRowVar2(mat, mu, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// SparseRowVarStd +NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sd, double vmax, bool display_progress); +RcppExport SEXP _scrattch_hicat_SparseRowVarStd(SEXP matSEXP, SEXP muSEXP, SEXP sdSEXP, SEXP vmaxSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< NumericVector >::type mu(muSEXP); + Rcpp::traits::input_parameter< NumericVector >::type sd(sdSEXP); + Rcpp::traits::input_parameter< double >::type vmax(vmaxSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(SparseRowVarStd(mat, mu, sd, vmax, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// FastLogVMR +Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); +RcppExport SEXP _scrattch_hicat_FastLogVMR(SEXP matSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(FastLogVMR(mat, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// RowVar +NumericVector RowVar(Eigen::Map x); +RcppExport SEXP _scrattch_hicat_RowVar(SEXP xSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::Map >::type x(xSEXP); + rcpp_result_gen = Rcpp::wrap(RowVar(x)); + return rcpp_result_gen; +END_RCPP +} +// SparseRowVar +Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); +RcppExport SEXP _scrattch_hicat_SparseRowVar(SEXP matSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + rcpp_result_gen = Rcpp::wrap(SparseRowVar(mat, display_progress)); + return rcpp_result_gen; +END_RCPP +} +// ReplaceColsC +Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement); +RcppExport SEXP _scrattch_hicat_ReplaceColsC(SEXP matSEXP, SEXP col_idxSEXP, SEXP replacementSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + Rcpp::traits::input_parameter< NumericVector >::type col_idx(col_idxSEXP); + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type replacement(replacementSEXP); + rcpp_result_gen = Rcpp::wrap(ReplaceColsC(mat, col_idx, replacement)); + return rcpp_result_gen; +END_RCPP +} +// GraphToNeighborHelper +List GraphToNeighborHelper(Eigen::SparseMatrix mat); +RcppExport SEXP _scrattch_hicat_GraphToNeighborHelper(SEXP matSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type mat(matSEXP); + rcpp_result_gen = Rcpp::wrap(GraphToNeighborHelper(mat)); + return rcpp_result_gen; +END_RCPP +} // ImputeKnn void ImputeKnn(IntegerMatrix knn_idx, IntegerVector ref_idx, IntegerVector cell_idx, IntegerVector gene_idx, NumericMatrix dat, NumericMatrix impute_dat, Nullable w_mat_, bool transpose_input, bool transpose_output); RcppExport SEXP _scrattch_hicat_ImputeKnn(SEXP knn_idxSEXP, SEXP ref_idxSEXP, SEXP cell_idxSEXP, SEXP gene_idxSEXP, SEXP datSEXP, SEXP impute_datSEXP, SEXP w_mat_SEXP, SEXP transpose_inputSEXP, SEXP transpose_outputSEXP) { @@ -23,9 +228,67 @@ BEGIN_RCPP return R_NilValue; END_RCPP } +// ComputeSNN +Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune); +RcppExport SEXP _scrattch_hicat_ComputeSNN(SEXP nn_rankedSEXP, SEXP pruneSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); + Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); + rcpp_result_gen = Rcpp::wrap(ComputeSNN(nn_ranked, prune)); + return rcpp_result_gen; +END_RCPP +} +// WriteEdgeFile +void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); +RcppExport SEXP _scrattch_hicat_WriteEdgeFile(SEXP snnSEXP, SEXP filenameSEXP, SEXP display_progressSEXP) { +BEGIN_RCPP + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Eigen::SparseMatrix >::type snn(snnSEXP); + Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + WriteEdgeFile(snn, filename, display_progress); + return R_NilValue; +END_RCPP +} +// DirectSNNToFile +Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); +RcppExport SEXP _scrattch_hicat_DirectSNNToFile(SEXP nn_rankedSEXP, SEXP pruneSEXP, SEXP display_progressSEXP, SEXP filenameSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Eigen::MatrixXd >::type nn_ranked(nn_rankedSEXP); + Rcpp::traits::input_parameter< double >::type prune(pruneSEXP); + Rcpp::traits::input_parameter< bool >::type display_progress(display_progressSEXP); + Rcpp::traits::input_parameter< String >::type filename(filenameSEXP); + rcpp_result_gen = Rcpp::wrap(DirectSNNToFile(nn_ranked, prune, display_progress, filename)); + return rcpp_result_gen; +END_RCPP +} static const R_CallMethodDef CallEntries[] = { + {"_scrattch_hicat_RowMergeMatrices", (DL_FUNC) &_scrattch_hicat_RowMergeMatrices, 5}, + {"_scrattch_hicat_RowMergeMatricesList", (DL_FUNC) &_scrattch_hicat_RowMergeMatricesList, 3}, + {"_scrattch_hicat_LogNorm", (DL_FUNC) &_scrattch_hicat_LogNorm, 3}, + {"_scrattch_hicat_Standardize", (DL_FUNC) &_scrattch_hicat_Standardize, 2}, + {"_scrattch_hicat_FastSparseRowScale", (DL_FUNC) &_scrattch_hicat_FastSparseRowScale, 5}, + {"_scrattch_hicat_FastSparseRowScaleWithKnownStats", (DL_FUNC) &_scrattch_hicat_FastSparseRowScaleWithKnownStats, 7}, + {"_scrattch_hicat_FastCov", (DL_FUNC) &_scrattch_hicat_FastCov, 2}, + {"_scrattch_hicat_FastCovMats", (DL_FUNC) &_scrattch_hicat_FastCovMats, 3}, + {"_scrattch_hicat_FastRBind", (DL_FUNC) &_scrattch_hicat_FastRBind, 2}, + {"_scrattch_hicat_SparseRowMean", (DL_FUNC) &_scrattch_hicat_SparseRowMean, 2}, + {"_scrattch_hicat_SparseRowVar2", (DL_FUNC) &_scrattch_hicat_SparseRowVar2, 3}, + {"_scrattch_hicat_SparseRowVarStd", (DL_FUNC) &_scrattch_hicat_SparseRowVarStd, 5}, + {"_scrattch_hicat_FastLogVMR", (DL_FUNC) &_scrattch_hicat_FastLogVMR, 2}, + {"_scrattch_hicat_RowVar", (DL_FUNC) &_scrattch_hicat_RowVar, 1}, + {"_scrattch_hicat_SparseRowVar", (DL_FUNC) &_scrattch_hicat_SparseRowVar, 2}, + {"_scrattch_hicat_ReplaceColsC", (DL_FUNC) &_scrattch_hicat_ReplaceColsC, 3}, + {"_scrattch_hicat_GraphToNeighborHelper", (DL_FUNC) &_scrattch_hicat_GraphToNeighborHelper, 1}, {"_scrattch_hicat_ImputeKnn", (DL_FUNC) &_scrattch_hicat_ImputeKnn, 9}, + {"_scrattch_hicat_ComputeSNN", (DL_FUNC) &_scrattch_hicat_ComputeSNN, 2}, + {"_scrattch_hicat_WriteEdgeFile", (DL_FUNC) &_scrattch_hicat_WriteEdgeFile, 3}, + {"_scrattch_hicat_DirectSNNToFile", (DL_FUNC) &_scrattch_hicat_DirectSNNToFile, 4}, {NULL, NULL, 0} }; diff --git a/src/data_manipulation.cpp b/src/data_manipulation.cpp new file mode 100644 index 0000000..5b9a740 --- /dev/null +++ b/src/data_manipulation.cpp @@ -0,0 +1,460 @@ +//Taken from Seurat package for faster data manipulation + +#include +#include +#include +#include +#include +#include +#include + +using namespace Rcpp; +// [[Rcpp::depends(RcppEigen)]] +// [[Rcpp::depends(RcppProgress)]] + + + +typedef Eigen::Triplet T; +// [[Rcpp::export(rng = false)]] +Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, + std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames){ + + + // Set up hash maps for rowname based lookup + std::unordered_map mat1_map; + for(unsigned int i = 0; i < mat1_rownames.size(); i++){ + mat1_map[mat1_rownames[i]] = i; + } + std::unordered_map mat2_map; + for(unsigned int i = 0; i < mat2_rownames.size(); i++){ + mat2_map[mat2_rownames[i]] = i; + } + + // set up tripletList for new matrix creation + std::vector tripletList; + int num_rows = all_rownames.size(); + int num_col1 = mat1.cols(); + int num_col2 = mat2.cols(); + + + tripletList.reserve(mat1.nonZeros() + mat2.nonZeros()); + for(int i = 0; i < num_rows; i++){ + std::string key = all_rownames[i]; + if (mat1_map.count(key)){ + for(Eigen::SparseMatrix::InnerIterator it1(mat1, mat1_map[key]); it1; ++it1){ + tripletList.emplace_back(i, it1.col(), it1.value()); + } + } + if (mat2_map.count(key)){ + for(Eigen::SparseMatrix::InnerIterator it2(mat2, mat2_map[key]); it2; ++it2){ + tripletList.emplace_back(i, num_col1 + it2.col(), it2.value()); + } + } + } + Eigen::SparseMatrix combined_mat(num_rows, num_col1 + num_col2); + combined_mat.setFromTriplets(tripletList.begin(), tripletList.end()); + return combined_mat; +} + +// [[Rcpp::export(rng = false)]] +Eigen::SparseMatrix RowMergeMatricesList( + List mat_list, + List mat_rownames, + std::vector< std::string > all_rownames +) { + // Convert Rcpp lists to c++ vectors + std::vector> mat_vec; + mat_vec.reserve(mat_list.size()); + std::vector> rownames_vec; + rownames_vec.reserve(mat_rownames.size()); + std::vector> map_vec; + map_vec.reserve(mat_list.size()); + int num_cols = 0; + int num_nZero = 0; + // offsets keep track of which column to add in to + std::vector offsets; + for (unsigned int i = 0; i < mat_list.size(); i++) { + mat_vec.emplace_back(Rcpp::as>(mat_list.at(i))); + rownames_vec.push_back(mat_rownames[i]); + // Set up hash maps for rowname based lookup + std::unordered_map mat_map; + for (unsigned int j = 0; j < rownames_vec[i].size(); j++) { + mat_map[rownames_vec[i][j]] = j; + } + map_vec.emplace_back(mat_map); + offsets.push_back(num_cols); + num_cols += mat_vec[i].cols(); + num_nZero += mat_vec[i].nonZeros(); + } + // set up tripletList for new matrix creation + std::vector tripletList; + int num_rows = all_rownames.size(); + tripletList.reserve(num_nZero); + // loop over all rows and add nonzero entries to tripletList + for(int i = 0; i < num_rows; i++) { + std::string key = all_rownames[i]; + for(int j = 0; j < mat_vec.size(); j++) { + if (map_vec[j].count(key)) { + for(Eigen::SparseMatrix::InnerIterator it1(mat_vec[j], map_vec[j][key]); it1; ++it1){ + tripletList.emplace_back(i, it1.col() + offsets[j], it1.value()); + } + } + } + } + Eigen::SparseMatrix combined_mat(num_rows, num_cols); + combined_mat.setFromTriplets(tripletList.begin(), tripletList.end()); + return combined_mat; +} + + +// [[Rcpp::export(rng = false)]] +Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, bool display_progress = true){ + Progress p(data.outerSize(), display_progress); + Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows()); + for (int k=0; k < data.outerSize(); ++k){ + p.increment(); + for (Eigen::SparseMatrix::InnerIterator it(data, k); it; ++it){ + it.valueRef() = log1p(double(it.value()) / colSums[k] * scale_factor); + } + } + return data; +} + +/* Performs column scaling and/or centering. Equivalent to using scale(mat, TRUE, apply(x,2,sd)) in R. + Note: Doesn't handle NA/NaNs in the same way the R implementation does, */ + +// [[Rcpp::export(rng = false)]] +NumericMatrix Standardize(Eigen::Map mat, bool display_progress = true){ + Progress p(mat.cols(), display_progress); + NumericMatrix std_mat(mat.rows(), mat.cols()); + for(int i=0; i < mat.cols(); ++i){ + p.increment(); + Eigen::ArrayXd r = mat.col(i).array(); + double colMean = r.mean(); + double colSdev = sqrt((r - colMean).square().sum() / (mat.rows() - 1)); + NumericMatrix::Column new_col = std_mat(_, i); + for(int j=0; j < new_col.size(); j++) { + new_col[j] = (r[j] - colMean) / colSdev; + } + } + return std_mat; +} + +// [[Rcpp::export(rng = false)]] +Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale = true, bool center = true, + double scale_max = 10, bool display_progress = true){ + mat = mat.transpose(); + Progress p(mat.outerSize(), display_progress); + Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); + for (int k=0; k::InnerIterator it(mat,k); it; ++it) + { + colMean += it.value(); + } + colMean = colMean / mat.rows(); + if (scale == true){ + int nnZero = 0; + if(center == true){ + for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) + { + nnZero += 1; + colSdev += pow((it.value() - colMean), 2); + } + colSdev += pow(colMean, 2) * (mat.rows() - nnZero); + } + else{ + for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) + { + colSdev += pow(it.value(), 2); + } + } + colSdev = sqrt(colSdev / (mat.rows() - 1)); + } + else{ + colSdev = 1; + } + if(center == false){ + colMean = 0; + } + Eigen::VectorXd col = Eigen::VectorXd(mat.col(k)); + scaled_mat.col(k) = (col.array() - colMean) / colSdev; + for(int s=0; s scale_max){ + scaled_mat(s,k) = scale_max; + } + } + } + return scaled_mat.transpose(); +} + +// [[Rcpp::export(rng = false)]] +Eigen::MatrixXd FastSparseRowScaleWithKnownStats(Eigen::SparseMatrix mat, NumericVector mu, NumericVector sigma, bool scale = true, bool center = true, + double scale_max = 10, bool display_progress = true){ + mat = mat.transpose(); + Progress p(mat.outerSize(), display_progress); + Eigen::MatrixXd scaled_mat(mat.rows(), mat.cols()); + for (int k=0; k scale_max){ + scaled_mat(s,k) = scale_max; + } + } + } + return scaled_mat.transpose(); +} + +/* Note: May not handle NA/NaNs in the same way the R implementation does, */ + +// [[Rcpp::export(rng = false)]] +Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center = true){ + if (center) { + mat = mat.rowwise() - mat.colwise().mean(); + } + Eigen::MatrixXd cov = (mat.adjoint() * mat) / double(mat.rows() - 1); + return(cov); +} + +// [[Rcpp::export(rng = false)]] +Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center = true){ + if(center){ + mat1 = mat1.rowwise() - mat1.colwise().mean(); + mat2 = mat2.rowwise() - mat2.colwise().mean(); + } + Eigen::MatrixXd cov = (mat1.adjoint() * mat2) / double(mat1.rows() - 1); + return(cov); +} + +/* Note: Faster than the R implementation but is not in-place */ +// [[Rcpp::export(rng = false)]] +Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2){ + Eigen::MatrixXd mat3(mat1.rows() + mat2.rows(), mat1.cols()); + mat3 << mat1, mat2; + return(mat3); +} + +/* Calculates the row means of the logged values in non-log space */ +// [[Rcpp::export(rng = false)]] +Eigen::VectorXd SparseRowMean(Eigen::SparseMatrix mat, bool display_progress){ + int ncols = mat.cols(); + Eigen::VectorXd rowmeans(mat.rows()); + mat = mat.transpose(); + if(display_progress == true){ + Rcpp::Rcerr << "Calculating gene means" << std::endl; + } + Progress p(mat.outerSize(), display_progress); + for (int k=0; k::InnerIterator it(mat,k); it; ++it){ + rm += expm1(it.value()); + } + rm = rm / ncols; + rowmeans[k] = log1p(rm); + } + return(rowmeans); +} + + +/* use this if you know the row means */ +// [[Rcpp::export(rng = false)]] +NumericVector SparseRowVar2(Eigen::SparseMatrix mat, + NumericVector mu, + bool display_progress){ + mat = mat.transpose(); + if(display_progress == true){ + Rcpp::Rcerr << "Calculating gene variances" << std::endl; + } + Progress p(mat.outerSize(), display_progress); + NumericVector allVars = no_init(mat.cols()); + for (int k=0; k::InnerIterator it(mat,k); it; ++it) { + nZero -= 1; + colSum += pow(it.value() - mu[k], 2); + } + colSum += pow(mu[k], 2) * nZero; + allVars[k] = colSum / (mat.rows() - 1); + } + return(allVars); +} + +/* standardize matrix rows using given mean and standard deviation, + clip values larger than vmax to vmax, + then return variance for each row */ +// [[Rcpp::export(rng = false)]] +NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, + NumericVector mu, + NumericVector sd, + double vmax, + bool display_progress){ + if(display_progress == true){ + Rcpp::Rcerr << "Calculating feature variances of standardized and clipped values" << std::endl; + } + mat = mat.transpose(); + NumericVector allVars(mat.cols()); + Progress p(mat.outerSize(), display_progress); + for (int k=0; k::InnerIterator it(mat,k); it; ++it) + { + nZero -= 1; + colSum += pow(std::min(vmax, (it.value() - mu[k]) / sd[k]), 2); + } + colSum += pow((0 - mu[k]) / sd[k], 2) * nZero; + allVars[k] = colSum / (mat.rows() - 1); + } + return(allVars); +} + +/* Calculate the variance to mean ratio (VMR) in non-logspace (return answer in +log-space) */ +// [[Rcpp::export(rng = false)]] +Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress){ + int ncols = mat.cols(); + Eigen::VectorXd rowdisp(mat.rows()); + mat = mat.transpose(); + if(display_progress == true){ + Rcpp::Rcerr << "Calculating gene variance to mean ratios" << std::endl; + } + Progress p(mat.outerSize(), display_progress); + for (int k=0; k::InnerIterator it(mat,k); it; ++it){ + rm += expm1(it.value()); + } + rm = rm / ncols; + for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ + v += pow(expm1(it.value()) - rm, 2); + nnZero += 1; + } + v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); + rowdisp[k] = log(v/rm); + + } + return(rowdisp); +} + +/* Calculates the variance of rows of a matrix */ +// [[Rcpp::export(rng = false)]] +NumericVector RowVar(Eigen::Map x){ + NumericVector out(x.rows()); + for(int i=0; i < x.rows(); ++i){ + Eigen::ArrayXd r = x.row(i).array(); + double rowMean = r.mean(); + out[i] = (r - rowMean).square().sum() / (x.cols() - 1); + } + return out; +} + +/* Calculate the variance in non-logspace (return answer in non-logspace) */ +// [[Rcpp::export(rng = false)]] +Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress){ + int ncols = mat.cols(); + Eigen::VectorXd rowdisp(mat.rows()); + mat = mat.transpose(); + if(display_progress == true){ + Rcpp::Rcerr << "Calculating gene variances" << std::endl; + } + Progress p(mat.outerSize(), display_progress); + for (int k=0; k::InnerIterator it(mat,k); it; ++it){ + rm += (it.value()); + } + rm = rm / ncols; + for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it){ + v += pow((it.value()) - rm, 2); + nnZero += 1; + } + v = (v + (ncols - nnZero) * pow(rm, 2)) / (ncols - 1); + rowdisp[k] = v; + } + return(rowdisp); +} + +//cols_idx should be 0-indexed +// [[Rcpp::export(rng = false)]] +Eigen::SparseMatrix ReplaceColsC(Eigen::SparseMatrix mat, NumericVector col_idx, Eigen::SparseMatrix replacement){ + int rep_idx = 0; + for(auto const &ci : col_idx){ + mat.col(ci) = replacement.col(rep_idx); + rep_idx += 1; + } + return(mat); +} + +template +std::vector sort_indexes(const std::vector &v) { + // initialize original index locations + std::vector idx(v.size()); + std::iota(idx.begin(), idx.end(), 0); + std::stable_sort(idx.begin(), idx.end(), + [&v](size_t i1, size_t i2) {return v[i1] < v[i2];}); + return idx; +} + +// [[Rcpp::export(rng = false)]] +List GraphToNeighborHelper(Eigen::SparseMatrix mat) { + mat = mat.transpose(); + //determine the number of neighbors + int n = 0; + for(Eigen::SparseMatrix::InnerIterator it(mat, 0); it; ++it) { + n += 1; + } + Eigen::MatrixXd nn_idx(mat.rows(), n); + Eigen::MatrixXd nn_dist(mat.rows(), n); + + for (int k=0; k row_idx; + std::vector row_dist; + row_idx.reserve(n); + row_dist.reserve(n); + for (Eigen::SparseMatrix::InnerIterator it(mat,k); it; ++it) { + if (n_k > (n-1)) { + Rcpp::stop("Not all cells have an equal number of neighbors."); + } + row_idx.push_back(it.row() + 1); + row_dist.push_back(it.value()); + n_k += 1; + } + if (n_k != n) { + Rcpp::Rcout << n << ":::" << n_k << std::endl; + Rcpp::stop("Not all cells have an equal number of neighbors."); + } + //order the idx based on dist + std::vector idx_order = sort_indexes(row_dist); + for(int i = 0; i < n; ++i) { + nn_idx(k, i) = row_idx[idx_order[i]]; + nn_dist(k, i) = row_dist[idx_order[i]]; + } + } + List neighbors = List::create(nn_idx, nn_dist); + return(neighbors); +} + diff --git a/src/data_manipulation.h b/src/data_manipulation.h new file mode 100644 index 0000000..892df0a --- /dev/null +++ b/src/data_manipulation.h @@ -0,0 +1,49 @@ +#ifndef DATA_MANIPULATION +#define DATA_MANIPULATION + +#include +#include +#include +#include +#include +#include + +using namespace Rcpp; + +//---------------------------------------------------- +Eigen::SparseMatrix RunUMISampling(Eigen::SparseMatrix data, int sample_val, + bool upsample, bool display_progress); +Eigen::SparseMatrix RunUMISamplingPerCell(Eigen::SparseMatrix data, + NumericVector sample_val, bool upsample, + bool display_progress); +Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, + Eigen::SparseMatrix mat2, + std::vector< std::string > mat1_rownames, + std::vector< std::string > mat2_rownames, + std::vector< std::string > all_rownames); +Eigen::SparseMatrix RowMergeMatricesList(List mat_list, List mat_rownames, std::vector< std::string > all_rownames); +Eigen::SparseMatrix LogNorm(Eigen::SparseMatrix data, int scale_factor, + bool display_progress ); +NumericMatrix Standardize(const Eigen::Map mat, bool display_progress); +Eigen::MatrixXd FastSparseRowScale(Eigen::SparseMatrix mat, bool scale, bool center, + double scale_max, bool display_progress); +Eigen::MatrixXd FastCov(Eigen::MatrixXd mat, bool center); +Eigen::MatrixXd FastCovMats(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2, bool center); +Eigen::MatrixXd FastRBind(Eigen::MatrixXd mat1, Eigen::MatrixXd mat2); +Eigen::VectorXd FastExpMean(Eigen::MatrixXd mat, bool display_progress); +Eigen::VectorXd FastRowMean(Eigen::MatrixXd mat, bool display_progress); +Eigen::VectorXd FastLogVMR(Eigen::SparseMatrix mat, bool display_progress); +Eigen::VectorXd FastExpVar(Eigen::SparseMatrix mat, bool display_progress); +Eigen::VectorXd SparseRowVar(Eigen::SparseMatrix mat, bool display_progress); +NumericVector SparseRowVar2(Eigen::SparseMatrix mat, + NumericVector mu, + bool display_progress); +NumericVector SparseRowVarStd(Eigen::SparseMatrix mat, + NumericVector mu, + NumericVector sd, + double vmax, + bool display_progress); +NumericVector RowVar(Eigen::Map x); +//---------------------------------------------------- + +#endif//DATA_MANIPULATION diff --git a/src/snn.cpp b/src/snn.cpp new file mode 100644 index 0000000..f0ce183 --- /dev/null +++ b/src/snn.cpp @@ -0,0 +1,73 @@ +#include +#include "data_manipulation.h" +#include +#include +#include +#include +#include +#include + +using namespace Rcpp; +// [[Rcpp::depends(RcppEigen)]] +// [[Rcpp::depends(RcppProgress)]] + +typedef Eigen::Triplet T; +//[[Rcpp::export]] +Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked, double prune) { + std::vector tripletList; + int k = nn_ranked.cols(); + tripletList.reserve(nn_ranked.rows() * nn_ranked.cols()); + int max_n=0; + for(int j=0; j max_n){ + max_n = nn_ranked(i,j); + } + } + } + Eigen::SparseMatrix SNN(nn_ranked.rows(), max_n); + SNN.setFromTriplets(tripletList.begin(), tripletList.end()); + SNN = SNN * (SNN.transpose()); + for (int i=0; i < SNN.outerSize(); ++i){ + for (Eigen::SparseMatrix::InnerIterator it(SNN, i); it; ++it){ + it.valueRef() = it.value()/(k + (k - it.value())); + if(it.value() < prune){ + it.valueRef() = 0; + } + } + } + SNN.prune(0.0); // actually remove pruned values + return SNN; +} + +//[[Rcpp::export]] +void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress){ + if (display_progress == true) { + Rcpp::Rcerr << "Writing SNN as edge file" << std::endl; + } + // Write out lower triangle + std::ofstream output; + output.open(filename); + Progress p(snn.outerSize(), display_progress); + for (int k=0; k < snn.outerSize(); ++k){ + p.increment(); + for (Eigen::SparseMatrix::InnerIterator it(snn, k); it; ++it){ + if(it.col() >= it.row()){ + continue; + } + output << std::setprecision(15) << it.col() << "\t" << it.row() << "\t" << it.value() << "\n"; + } + } + output.close(); +} + +// Wrapper function so that we don't have to go back into R before writing to file +//[[Rcpp::export]] +Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, + double prune, bool display_progress, + String filename) { + Eigen::SparseMatrix SNN = ComputeSNN(nn_ranked, prune); + WriteEdgeFile(SNN, filename, display_progress); + return SNN; +} diff --git a/src/snn.h b/src/snn.h new file mode 100644 index 0000000..16dba77 --- /dev/null +++ b/src/snn.h @@ -0,0 +1,21 @@ +#ifndef SNN +#define SNN + +#include +#include "data_manipulation.h" +#include +#include +#include +#include +#include +#include + +using namespace Rcpp; + +//---------------------------------------------------- +Eigen::SparseMatrix ComputeSNN(Eigen::MatrixXd nn_ranked); +void WriteEdgeFile(Eigen::SparseMatrix snn, String filename, bool display_progress); +Eigen::SparseMatrix DirectSNNToFile(Eigen::MatrixXd nn_ranked, double prune, bool display_progress, String filename); +//---------------------------------------------------- + +#endif//SNN From 43c503399a58c6acfb60407ab5cd3f319343b9aa Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 18 May 2021 13:21:29 -0400 Subject: [PATCH 55/70] Remove debug message --- R/harmonize.R | 16 +++++----------- R/harmonize_impute.R | 9 ++++----- R/harmonize_merge.R | 12 +----------- R/harmonize_util.R | 4 ---- R/merge_cl.R | 1 - R/reduceDimension_PCA.R | 4 ---- R/reduceDimension_WGCNA.R | 1 - R/reduceDimension_plot.R | 4 ---- 8 files changed, 10 insertions(+), 41 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index 41daa3f..3407824 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -197,8 +197,6 @@ get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, m #' @examples get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transposed=TRUE) { - - print(method) if(method=="cor"){ if(transposed){ knn.index = knn_cor(ref.dat, dat,k=k) @@ -502,7 +500,6 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) } cl.platform.counts = table(meta.df[names(cl), "platform"],cl) - print(cl.platform.counts) ###If a cluster is not present in reference sets, split the cells based on imputed cluster based on cells in reference set. ref.de.param.list = de.param.list[ref.sets] @@ -510,10 +507,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= cl.big= cl.platform.counts[ref.sets,,drop=F] >= cl.min.cells bad.cl = colnames(cl.big)[colSums(cl.big) ==0] if(length(bad.cl) > 0){ - print("Bad.cl") - print(bad.cl) tmp.cells = names(cl)[cl %in% bad.cl] - ##########FIX BUG pred.df = predict_knn(result$knn[tmp.cells,,drop=F], all.cells, cl)$pred.df pred.cl= setNames(as.character(pred.df$pred.target), row.names(pred.df)) cl[names(pred.cl)]= pred.cl @@ -528,7 +522,9 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= if(length(unique(cl))<=1){ return(NULL) } - print(table(cl)) + if(verbose){ + print(table(cl)) + } result$ref.list = ref.list result$cl = cl result$markers = select.genes @@ -653,7 +649,6 @@ harmonize <- function(comb.dat, prefix, overwrite=TRUE, dir=".",...) dir.create(dir) } fn = file.path(dir, paste0(prefix, ".rda")) - print(fn) if(!overwrite){ if(file.exists(fn)){ load(fn) @@ -709,10 +704,9 @@ i_harmonize <- function(comb.dat, select.cells=comb.dat$all.cells, ref.sets=name tmp.prefix=paste(prefix, i,sep=".") print(tmp.prefix) select.cells= names(cl)[cl == i] - platform.size = table(meta.df[select.cells, "platform"]) - + platform.size = table(meta.df[select.cells, "platform"]) print(platform.size) - + sets = names(platform.size) pass.th = sapply(ref.sets, function(set)platform.size[[set]] >= de.param.list[[set]]$min.cells) diff --git a/R/harmonize_impute.R b/R/harmonize_impute.R index 5c90530..6e3fcbe 100644 --- a/R/harmonize_impute.R +++ b/R/harmonize_impute.R @@ -29,11 +29,12 @@ get_knn_weight <- function(knn.dist, scale=0.2, exclude.th = 0.0001) ##' @author Zizhen Yao predict_knn <- function(knn.idx, reference, cl, mc.cores=1) { - library(matrixStats) library(data.table) library(dplyr) library(parallel) + defaultW <- getOption("warn") + options(warn = -1) query = row.names(knn.idx) if(nrow(knn.idx) < 10000){ mc.cores=1 @@ -51,6 +52,7 @@ predict_knn <- function(knn.idx, reference, cl, mc.cores=1) pred.df = as.data.frame(pred.df) row.names(pred.df) = pred.df$query pred.df$query=NULL + options(warn = defaultW) return(list(pred.df=pred.df, pred.prob = pred.prob)) } @@ -137,8 +139,7 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell } ###cross-modality Imputation based on nearest neighbors in each iteraction of clustering using anchoring genes or genes shown to be differentiall expressed. - for(x in names(split.results)){ - print(x) + for(x in names(split.results)){ result = split.results[[x]] if(x == names(split.results)[1]){ impute.genes = select.genes @@ -149,11 +150,9 @@ impute_knn_global <- function(comb.dat, split.results, select.genes, select.cell cl = result$cl knn = result$knn for(ref.set in intersect(names(result$ref.list),names(ref.list))){ - print(ref.set) tmp.cells = row.names(knn) query.cells = intersect(tmp.cells[comb.dat$meta.df[tmp.cells,"platform"] != ref.set], select.cells) select.cols = comb.dat$meta.df[comb.dat$all.cells[knn[1,]],"platform"] == ref.set - cat("Impute genes", length(impute.genes),"\n") if(sum(select.cols)==0){ next } diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 34cc0cc..627f688 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -189,7 +189,7 @@ get_cl_sim_multiple <- function(cl.rd.list, FUN =pmax) ##' @author Zizhen Yao merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbose=TRUE, pairBatch=40, de.genes.list=NULL, lfc.conservation.th=0.7, merge.type="undirectional", de.method="fast_limma") { - print("merge_cl_multiple") + #print("merge_cl_multiple") cl = setNames(as.character(cl),names(cl)) merge_x_y <- function(x, y) @@ -292,13 +292,7 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo add_pairs_de_genes <- function(de.genes.list, cl, new.pairs, common.genes) { - if(verbose){ - print("Add de genes") - } de.genes.list <- de_genes_pairs_multiple(merge.dat.list, merge.de.param.list, common.genes=common.genes, cl=cl, pairs=new.pairs, cl.means.list=cl.means.list, cl.present.list=cl.present.list, cl.sqr.means.list= cl.sqr.means.list,lfc.conservation.th=lfc.conservation.th, de.genes.list=de.genes.list,method=de.method) - if(verbose){ - print("Finish adding de genes") - } return(de.genes.list) } @@ -361,7 +355,6 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo knn.idx = get_knn(dat[,query.cells,drop=F], dat[,ref.cells,drop=F], method="Annoy.Euclidean", k=min(15, ceiling(length(ref.cells)/2))) pred.result = predict_knn(knn.idx=knn.idx, reference = ref.cells, cl=cl) tmp.cl = with(pred.result$pred.df, setNames(pred.cl, row.names(pred.result$pred.df))) - print(tmp.cl) cl[names(tmp.cl)] = tmp.cl } } @@ -457,9 +450,6 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo if (length(unique(cl)) < 2) { return(NULL) } - if (verbose > 0) { - print(table(cl)) - } return(cl) } diff --git a/R/harmonize_util.R b/R/harmonize_util.R index 6920b8a..83364ff 100644 --- a/R/harmonize_util.R +++ b/R/harmonize_util.R @@ -304,7 +304,6 @@ get_de_lfc_list <- function(cl.means.list) sets=names(cl.means.list) de.gene.sign = NULL de.lfc.list = sapply(sets, function(set){ - print(set) cl.means = cl.means.list[[set]] cn = colnames(cl.means) cl.n = length(cn) @@ -514,7 +513,6 @@ gene_gene_cor_conservation <- function(dat.list, select.genes, select.cells,pair { sets = names(dat.list) gene.cor.list = sapply(sets, function(set){ - print(set) dat = dat.list[[set]] gene.cor = cor(t(as.matrix(dat[select.genes,intersect(colnames(dat),select.cells)]))) gene.cor[is.na(gene.cor)] = 0 @@ -527,7 +525,6 @@ gene_gene_cor_conservation <- function(dat.list, select.genes, select.cells,pair } gene.cor.mat= sapply(1:nrow(pairs), function(i){ p = pairs[i,] - print(p) pair_cor(gene.cor.list[[p[1]]], gene.cor.list[[p[2]]]) }) colnames(gene.cor.mat) = paste0(pairs[,1],":",pairs[,2]) @@ -576,7 +573,6 @@ plot_markers <- function(dat.list, cl, de.param.list,prefix, common.genes, comb if(is.factor(tmp.cl)){ tmp.cl = droplevels(tmp.cl) } - print(table(tmp.cl)) tmp=display_cl(cl=tmp.cl, norm.dat=dat, max.cl.size = 200, de.param=de.param.list[[set]], n.markers=n.markers)$de.genes },simplify=F) comb.de.genes = comb_de_result(de.genes.list, cl.means.list, common.genes=common.genes) diff --git a/R/merge_cl.R b/R/merge_cl.R index 6b7283a..8bde21d 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -76,7 +76,6 @@ merge_cl<- function(norm.dat, pairs=do.call("rbind",strsplit(names(de.genes), "_")) row.names(pairs)=names(de.genes) } - print("get cl.rd") ###Merge small clusters with the closest neighbors first. if(!is.null(rd.dat)){ cl.rd = as.data.frame(get_cl_means(rd.dat,cl[names(cl) %in% row.names(rd.dat)])) diff --git a/R/reduceDimension_PCA.R b/R/reduceDimension_PCA.R index a2e3d02..270792e 100644 --- a/R/reduceDimension_PCA.R +++ b/R/reduceDimension_PCA.R @@ -26,12 +26,8 @@ rd_PCA <- function(norm.dat, select.genes=row.names(norm.dat), select.cells=coln rd.dat = tmp$rd.dat pca = tmp$pca if(length(sampled.cells)< length(select.cells)){ - if(verbose){ - print("Project") - } require(parallel) rd.dat = parallel::pvec(select.cells, function(x){ - print(length(x)) tmp.dat = norm.dat[row.names(rot), x,drop=F] rd.dat = as.matrix(Matrix::crossprod(tmp.dat, rot)) return(list(rd.dat)) diff --git a/R/reduceDimension_WGCNA.R b/R/reduceDimension_WGCNA.R index 4dad508..2104f2f 100644 --- a/R/reduceDimension_WGCNA.R +++ b/R/reduceDimension_WGCNA.R @@ -63,7 +63,6 @@ filter_gene_mod <- function(norm.dat, select.cells, gene.mod, minModuleSize=10, rm.cor=cor(eigen, rm.eigen[select.cells,]) rm.cor[is.na(rm.cor)]=0 rm.score = setNames(rowMaxs(abs(rm.cor)), colnames(eigen)) - print(rm.score) select = rm.score < rm.th if(sum(!select)){ print("Remove module") diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index bf28eff..1345ec0 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -350,7 +350,6 @@ plot_3d_label_multiple <- function(df, cols, label_cols, cex=0.7, label.cex=0.7, { n.win = length(cols) library(rgl) - print("start plotting") mfrow3d(1,n.win) next3d() @@ -548,7 +547,6 @@ plot_2d_umap_anno <- function(umap.fn, } else { if(show.legend==TRUE){ - print("legend") g <- plot_RD_cl(rd.dat=umap.2d, cl=cl, cl.color = cl.color, cl.label =cl.label,alpha.val=alpha, cex=cex,label.center=FALSE, show.legend = TRUE) g[["labels"]][["colour"]] <- "Cluster" legend <- cowplot::get_legend(g) @@ -578,7 +576,6 @@ plot_2d_umap_anno <- function(umap.fn, alpha=alpha) if(show.legend==TRUE){ - print("legend") g[["labels"]][["colour"]] <- m legend <- cowplot::get_legend(g) g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ @@ -589,7 +586,6 @@ plot_2d_umap_anno <- function(umap.fn, plot.list[[m]] <- g } else{ - print("no leg") g = g + theme(axis.title.x=element_blank(), axis.title.y=element_blank())+ theme_void() + theme(legend.position="none") + From 0100cd3bc8920b9e19068556ca13092739b0ef90 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Thu, 20 May 2021 13:28:20 -0400 Subject: [PATCH 56/70] Add l2norm function --- DESCRIPTION | 4 +- R/harmonize.R | 137 +++++++++++++++++++++++++------------------------- R/util.R | 21 ++++++-- 3 files changed, 89 insertions(+), 73 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4a8afc8..ef590dd 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: scrattch.hicat Title: Hierarchical Iterative Clustering Analysis for Transcriptomic data -Version: 1.0.5 +Version: 1.0.6 Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role = c("aut")), person("Lucas", "Graybuck", email = "lucasg@alleninstitute.org", role = c("aut", "cre")), person("Trygve", "Bakken", email = "trygveb@alleninstitute.org", role = c("aut")), @@ -11,7 +11,7 @@ Authors@R: c(person("Zizhen", "Yao", email = "zizheny@alleninstitute.org", role person("Saroja","Somasundaram", email="sarojas@alleninstitute.org", role = c("aut"))) Description: Iteractive clustering of single cell RNASeq dataset. BugReports: https://github.com/AllenInstitute/scrattch.hicat/issues -Depends: R (>= 3.3.0) +Depends: R (>= 4.0.0) License: GPL-3 Encoding: UTF-8 LazyData: TRUE diff --git a/R/harmonize.R b/R/harmonize.R index 3407824..cec84cd 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -207,40 +207,37 @@ get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transpo knn.index = knn_cor(ref.dat, dat,k=k) } } - else if(method=="RANN"){ + else{ if(transposed){ - ref.dat = Matrix::t(ref.dat) + if(is.null(index)){ + ref.dat = Matrix::t(ref.dat) + } dat = Matrix::t(dat) + } + if(method=="RANN"){ + knn.index = RANN::nn2(ref.dat, dat, k=k)[[1]] } - knn.index = RANN::nn2(ref.dat, dat, k=k)[[1]] - } - else if(method %in% c("Annoy.Euclidean", "Annoy.Angular")){ - library(BiocNeighbors) - if(is.null(index)){ - if (method=="Annoy.Euclidean"){ - distance="Euclidean" - } - else{ - distance="Angular" + if(method %in% c("Annoy.Euclidean", "Annoy.Cosine")){ + library(BiocNeighbors) + if(is.null(index)){ + if (method=="Annoy.Cosine"){ + ref.dat = l2norm(ref.dat,transposed=FALSE) + dat = l2norm(dat,transposed=FALSE) + } + index= buildAnnoy(ref.dat) } - index= buildAnnoy(ref.dat,distance=distance, transposed=transposed) + knn.index = queryAnnoy(X= ref.dat, query=dat, k=k, precomputed = index)[[1]] + } + else if(method == "CCA"){ + mat3 = crossprod(ref.dat, dat) + cca.svd <- irlba(mat3, dim=dim) + knn.index = knn_cor(cca.svd$u, cca.svd$v, k=k) + } + else{ + stop(paste(method, "method unknown")) } - knn.index = queryAnnoy(X= ref.dat, query=dat, k=k, precomputed = index, transposed=transposed)[[1]] - } - else if(method == "CCA"){ - mat3 = crossprod(ref.dat, dat) - cca.svd <- irlba(mat3, dim=dim) - knn.index = knn_cor(cca.svd$u, cca.svd$v, k=k) - } - else{ - stop(paste(method, "method unknown")) - } - if(!transposed){ - row.names(knn.index) = row.names(dat) - } - else{ - row.names(knn.index) = colnames(dat) } + row.names(knn.index) = row.names(dat) return(knn.index) } @@ -359,7 +356,7 @@ cleanAnnoyIndex <- function(index) #' @export #' #' @examples -compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, method=c("cor","Annoy.Angular"), self.method=c("RANN","Annoy.Euclidean"), batch.size=10000, mc.cores=1) +compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, cross.knn.method=c("cor","Annoy.Cosine"), self.knn.method=c("RANN","Annoy.Euclidean"), batch.size=10000, mc.cores=1) { cat("Number of select genes", length(select.genes), "\n") @@ -379,6 +376,9 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb } dat = dat.list[[ref.set]] ref.cells = ref.list[[ref.set]] + ref.dat = dat[select.genes,ref.cells] + ref.cells = colnames(ref.dat)[colSums(ref.dat) > 0] + ref.dat = ref.dat[,ref.cells] map.cells= intersect(select.cells, colnames(dat)) if(length(map.cells)==0){ next @@ -390,24 +390,21 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb rd.dat = rd_PCA(dat,select.genes=select.genes, select.cells=map.cells, max.pca = 50, sampled.cells=ref.cells, th=1, mc.cores=tmp.cores)$rd.dat ref.rd.dat = rd.dat[ref.cells,,drop=F] idx = match(ref.cells, comb.dat$all.cells) - if(self.method== "RANN"){ - require(RANN) - knn = RANN::nn2(ref.rd.dat , rd.dat, k=k.tmp)[[1]] - row.names(knn) = row.names(rd.dat) - } - else{ + index = NULL + if(self.knn.method %in% c("Annoy.Euclidean")){ require(BiocNeighbors) - index = buildAnnoy(ref.rd.dat, distance ="Euclidean", transposed = FALSE) - knn=get_knn_batch(dat=rd.dat, ref.dat = ref.rd.dat, k=k.tmp, method = self.method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=FALSE) - cleanAnnoyIndex(index) + index = buildAnnoy(ref.rd.dat, distance ="Euclidean", transposed = FALSE) } + knn=get_knn_batch(dat=rd.dat, ref.dat = ref.rd.dat, k=k.tmp, method = self.knn.method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=FALSE) + if(!is.null(index)){ + cleanAnnoyIndex(index) + } knn = matrix(idx[knn], nrow=nrow(knn), dimnames=list(row.names(knn), NULL)) self.knn = knn index = NULL - ref.dat = dat[select.genes,ref.cells] - if(method %in% c("Annoy.Euclidean", "Annoy.Angular")){ - if(method=="Annoy.Angular"){ - distance = "Angular" + if(cross.knn.method %in% c("Annoy.Euclidean", "Annoy.Cosine")){ + if(cross.knn.method=="Annoy.Cosine"){ + distance = "Cosine" } else{ distance = "Euclidean" @@ -425,11 +422,11 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb if(ncol(dat)< batch.size){ tmp.cores = 1 } - knn=get_knn_batch(dat=dat, ref.dat = ref.dat, k=k.tmp, method = method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=TRUE) + knn=get_knn_batch(dat=dat, ref.dat = ref.dat, k=k.tmp, method = cross.knn.method, batch.size = batch.size, mc.cores=tmp.cores, index=index, transposed=TRUE) if(!is.null(comb.dat$cl.list)){ test.knn = test_knn(knn, comb.dat$cl.list[[set]], colnames(ref.dat), comb.dat$cl.list[[ref.set]]) if(!is.null(test.knn)){ - cat("Knn", set, ref.set, method, "cl.score", test.knn$cl.score, "cell.score", test.knn$cell.score,"\n") + cat("Knn", set, ref.set, cross.knn.method, "cl.score", test.knn$cl.score, "cell.score", test.knn$cell.score,"\n") } } knn = matrix(idx[knn], nrow=nrow(knn), dimnames=list(row.names(knn), NULL)) @@ -452,8 +449,8 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb #' @param merge.sets #' @param select.cells #' @param select.genes -#' @param method -#' @param self.method +#' @param cross.knn.method +#' @param self.knn.method #' @param k #' @param sample.size #' @param cl.sample.size @@ -466,7 +463,7 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb #' @export #' #' @examples -knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= names(comb.dat$dat.list),merge.sets=ref.sets, select.cells=comb.dat$all.cells, select.genes=NULL, method="cor", self.method = "RANN", k=15, sample.size = 5000, cl.sample.size = 100, batch.size = 10000, verbose=TRUE,mc.cores=1,...) +knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= names(comb.dat$dat.list),merge.sets=ref.sets, select.cells=comb.dat$all.cells, select.genes=NULL, cross.knn.method="cor", self.knn.method = "RANN", method = "louvain", k=15, sample.size = 5000, cl.sample.size = 100, batch.size = 10000, verbose=TRUE,mc.cores=1,...) { #attach(comb.dat) with(comb.dat,{ @@ -483,16 +480,15 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= return(NULL) } - knn.comb= compute_knn(comb.dat, select.genes=select.genes, ref.list=ref.list, select.sets=select.sets, select.cells=select.cells, k=k, method=method, self.method=self.method, batch.size=batch.size, mc.cores=mc.cores) + knn.comb= compute_knn(comb.dat, select.genes=select.genes, ref.list=ref.list, select.sets=select.sets, select.cells=select.cells, k=k, cross.knn.method =cross.knn.method, self.knn.method=self.knn.method, batch.size=batch.size, mc.cores=mc.cores) if(is.null(knn.comb)){ return(NULL) } sampled.cells = unlist(cells.list) - result = knn_jaccard_louvain(knn.comb[sampled.cells,]) - result$cl.mat = as.matrix(t(result$memberships)) - row.names(result$cl.mat) = sampled.cells + result = knn_jaccard_clust(knn.comb[sampled.cells,], method=method) result$knn = knn.comb - cl = setNames(result$cl.mat[,1], row.names(result$cl.mat)) + ###preliminary clusters from louvain or leiden + cl = result$cl if(length(cl) < nrow(result$knn)){ diff.cells = setdiff(row.names(result$knn), names(cl)) pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl )$pred.df @@ -602,34 +598,39 @@ knn_cosine <- function(ref.dat, query.dat, k = 15) #' @export #' #' @examples -knn_jaccard_louvain <- function(knn.index, ...) +##' .. content for \description{} (no empty lines) .. +##' +##' .. content for \details{} .. +##' @title +##' @param knn.index +##' @param method +##' @param prune +##' @return +##' @author Zizhen Yao +knn_jaccard_clust <- function(knn.index, method=c("louvain","leiden"),prune=0.05) { require(igraph) cat("Get jaccard\n") #sim=knn_jaccard(knn.index,...) - sim = ComputeSNN(knn.index,...) + sim = ComputeSNN(knn.index,prune=prune) rownames(sim) = colnames(sim) = row.names(knn.index) - cat("Louvain clustering\n") gr <- igraph::graph.adjacency(sim, mode = "undirected", weighted = TRUE) - result <- igraph::cluster_louvain(gr) + if(method[1]=="louvain"){ + cat("Louvain clustering\n") + result <- igraph::cluster_louvain(gr,...) + } + else{ + cat("Leiden clustering\n") + library(leidenAlg) + result <- leiden.community(gr) + } + result$cl=membership(result) return(result) } -knn_jaccard_leiden <- function(knn.index) - { - require(igraph) - require(leiden) - cat("Get jaccard\n") - sim=knn_jaccard(knn.index) - cat("leiden clustering\n") - result <- leiden(sim) - return(result) - } - - #' Harmonize #' diff --git a/R/util.R b/R/util.R index a859794..c1a3256 100644 --- a/R/util.R +++ b/R/util.R @@ -528,9 +528,8 @@ cpm <- function(counts, sf=NULL, denom=1e6) { sf <- Matrix::colSums(counts) } sf = sf/denom - - if(is.matrix(counts)){ - return(t(t(counts) / sf)) + if(is.matrix(counts)){ + return(sweep(counts, 2, sf, "/", check.margin=FALSE)) } else if(class(counts) == "dgCMatrix") { sep <- counts@p sep <- sep[-1] - sep[-length(sep)] @@ -630,3 +629,19 @@ filter_by_size <- function(cat, min.size) } } +l2norm <- function(X, transposed=TRUE) +{ + if (transposed) { + l2norm <- sqrt(colSums(X^2)) + if (any(l2norm==0)) { + stop("L2 norms of zero detected for distance='Cosine'") + } + sweep(X, 2, l2norm, "/", check.margin=FALSE) + } else { + l2norm <- sqrt(rowSums(X^2)) + if (any(l2norm==0)) { + stop("L2 norms of zero detected for distance='Cosine'") + } + X/l2norm + } +} From 15a499f8412a678368a1b3e5a1f8c7a0c98fa1a0 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Fri, 11 Jun 2021 14:22:37 -0700 Subject: [PATCH 57/70] Add Rcpp parallel function --- DESCRIPTION | 5 +- NAMESPACE | 1 + src/Makevars | 5 +- src/Rcpp_parallel.cpp | 236 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 244 insertions(+), 3 deletions(-) create mode 100644 src/Rcpp_parallel.cpp diff --git a/DESCRIPTION b/DESCRIPTION index ef590dd..2acdead 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,8 +35,9 @@ Imports: Matrix, matrixStats, pvclust, - Rtsne -LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress + Rtsne, + RcppParallel +LinkingTo: Rcpp (>= 0.11.0), RcppEigen, RcppProgress, beachmat, RcppParallel Suggests: WGCNA, knitr, diff --git a/NAMESPACE b/NAMESPACE index df46869..bed3cc3 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ useDynLib(scrattch.hicat) importFrom(Rcpp, sourceCpp) importFrom(Rcpp, evalCpp) +importFrom(RcppParallel, RcppParallelLibs) exportPattern("^[[:alpha:]]+") diff --git a/src/Makevars b/src/Makevars index 467628d..8e91f28 100644 --- a/src/Makevars +++ b/src/Makevars @@ -1,3 +1,6 @@ ## Use the R_HOME indirection to support ## installations of multiple R version ## ## NB: No longer needed, see below -PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` \ No newline at end of file +PKG_LIBS = `$(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()"` + +CXX_STD = CXX11 +PKG_LIBS += $(shell ${R_HOME}/bin/Rscript -e "RcppParallel::RcppParallelLibs()") \ No newline at end of file diff --git a/src/Rcpp_parallel.cpp b/src/Rcpp_parallel.cpp new file mode 100644 index 0000000..ef019d4 --- /dev/null +++ b/src/Rcpp_parallel.cpp @@ -0,0 +1,236 @@ +//rcpp_get_cl_means.cpp + +// [[Rcpp::depends(beachmat)]] + +#include +#include "beachmat3/beachmat.h" + +#include +#include +#include +using namespace Rcpp; + +// [[Rcpp::plugins(openmp)]] +// [[Rcpp::depends(beachmat)]] +////////////////////////////////////////////////////////////////////////////////// +// method1: iterate over only the non-zero elements in a column in a sparse matrix +////////////////////////////////////////////////////////////////////////////////// + +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector clAll_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(clAll_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(clAll_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(clAll_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + res(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; +} + + + + + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +/*The function calls the ColumnMeanSparse*/ +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_means_openMP_match(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector clAll_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(clAll_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(clAll_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(clAll_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + + #if defined(_OPENMP) + #pragma omp parallel num_threads(ncores) + #pragma omp for + #endif + + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + res(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; + + +} \ No newline at end of file From 46ac20e0421c05bec5b18bd889a4b599a0aa74af Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Fri, 11 Jun 2021 17:31:35 -0700 Subject: [PATCH 58/70] Add get_cl_present and get_cl_sqr_means --- src/Rcpp_parallel.cpp | 487 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 482 insertions(+), 5 deletions(-) diff --git a/src/Rcpp_parallel.cpp b/src/Rcpp_parallel.cpp index ef019d4..b316beb 100644 --- a/src/Rcpp_parallel.cpp +++ b/src/Rcpp_parallel.cpp @@ -1,10 +1,10 @@ -//rcpp_get_cl_means.cpp +//Rcpp_parallel.cpp // [[Rcpp::depends(beachmat)]] #include #include "beachmat3/beachmat.h" - +#include #include #include #include @@ -12,8 +12,11 @@ using namespace Rcpp; // [[Rcpp::plugins(openmp)]] // [[Rcpp::depends(beachmat)]] + + + ////////////////////////////////////////////////////////////////////////////////// -// method1: iterate over only the non-zero elements in a column in a sparse matrix +// get_cl_means method1: iterate over only the non-zero elements in a column in a sparse matrix ////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] @@ -123,14 +126,14 @@ Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVect ////////////////////////////////////////////////////////////////////////////////////////////////////// -// method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +// get_cl_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP ////////////////////////////////////////////////////////////////////////////////////////////////////// /*The function calls the ColumnMeanSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_means_openMP_match(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ +Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -233,4 +236,478 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP_match(Rcpp::RObject mat, Rcpp::Inte return res; +} + + + + + + + +////////////////////////////////////////////////////////////////////////////////// +// get_cl_present method1: iterate over only the non-zero elements in a column in a sparse matrix +////////////////////////////////////////////////////////////////////////////////// + +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + if(*(xptr+row_i) < lowth) + continue; + + res(*(iptr+row_i), mat_cluster_vector[col_i]) += 1.0; + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; +} + + + + + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// get_cl_present method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +/*The function calls the ColumnMeanSparse*/ +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth, int ncores){ + // call R function to reorder and subset cluster vector + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + #if defined(_OPENMP) + #pragma omp parallel num_threads(ncores) + #pragma omp for + #endif + + for (int row_i = 0; row_i < nnzero; row_i++){ + + if(*(xptr+row_i) < lowth) + continue; + + res(*(iptr+row_i), mat_cluster_vector[col_i]) += 1; + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; + + + + + + +} + + + + + +////////////////////////////////////////////////////////////////////////////////// +// get_cl_sq_means method1: iterate over only the non-zero elements in a column in a sparse matrix +////////////////////////////////////////////////////////////////////////////////// + +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + + res(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; +} + + + + + + + + + +////////////////////////////////////////////////////////////////////////////////////////////////////// +// get_cl_sq_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +/*The function calls the ColumnMeanSparse*/ +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_sqr_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ + // call R function to reorder and subset cluster vector + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; + + + /* Count cells in each cluster + unique_clusters = number of clusters = 10 + cluster_id_number = number of cells in each cluster correspond to colnames_vec */ + int unique_clusters = cluster_col_map.size(); + std::vector cluster_id_number(unique_clusters, 0); + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + cluster_id_number[cluster_col_map[cl[i]]]++; + } + + /* Loop though sparse matrix and access non-zero entry + res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters + loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), unique_clusters); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + // skip the column if it doesn't exist in clAll + if (cl[col_i] < 1) + continue; + + // loop over col_i-th column of mat matrix + auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + #if defined(_OPENMP) + #pragma omp parallel num_threads(ncores) + #pragma omp for + #endif + + for (int row_i = 0; row_i < nnzero; row_i++){ + + + res(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); + } + } + + + // loop over columns of res matrix, and divide by number of cells in each cluster + for (int i = 0; i < res.ncol(); i++){ + NumericMatrix::Column col = res( _ , i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; + + + + + + } \ No newline at end of file From f05481cd00687ad93109557d3d87a31dec247271 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Tue, 15 Jun 2021 10:58:20 -0700 Subject: [PATCH 59/70] Add get_cl_medians function --- src/Rcpp_parallel.cpp | 604 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 498 insertions(+), 106 deletions(-) diff --git a/src/Rcpp_parallel.cpp b/src/Rcpp_parallel.cpp index b316beb..7491903 100644 --- a/src/Rcpp_parallel.cpp +++ b/src/Rcpp_parallel.cpp @@ -1,26 +1,26 @@ //Rcpp_parallel.cpp // [[Rcpp::depends(beachmat)]] +// [[Rcpp::depends(RcppParallel)]] #include #include "beachmat3/beachmat.h" +#include #include #include #include #include using namespace Rcpp; - -// [[Rcpp::plugins(openmp)]] -// [[Rcpp::depends(beachmat)]] +using namespace RcppParallel; -////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////// // get_cl_means method1: iterate over only the non-zero elements in a column in a sparse matrix -////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ +Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -47,7 +47,8 @@ Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVect } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -67,11 +68,10 @@ Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVect mat_cluster_vector[i] = cluster_col_map[cl[i]]; } } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; /* Count cells in each cluster - unique_clusters = number of clusters = 10 + unique_clusters = number of clusters cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); @@ -95,8 +95,8 @@ Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVect // loop over col_i-th column of mat matrix auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices + auto xptr = indices.x; + auto iptr = indices.i; auto nnzero = indices.n; for (int row_i = 0; row_i < nnzero; row_i++){ @@ -126,14 +126,58 @@ Rcpp::NumericMatrix rcpp_get_cl_means_match(Rcpp::RObject mat, Rcpp::IntegerVect ////////////////////////////////////////////////////////////////////////////////////////////////////// -// get_cl_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +// get_cl_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// +/*To use parallelFor, create a Worker object that defines an operator() which is called by the parallel scheduler.*/ + +struct ColumnMeanSparse : public Worker +{ + // source matrix and maps + beachmat::lin_sparse_matrix* matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + // destination matrix + RMatrix output; + + // initialize with source and destination + ColumnMeanSparse(beachmat::lin_sparse_matrix* matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} + + // get the row sum of the given cols + void operator()(std::size_t begin, std::size_t end) { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++){ + + if (cl[col_i] < 1) + continue; + + + // loop over col_i-th column of mat matrix + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + output(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); + } + + } + } +}; + /*The function calls the ColumnMeanSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ +Rcpp::NumericMatrix rcpp_get_cl_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -160,7 +204,8 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVec } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -180,7 +225,6 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVec mat_cluster_vector[i] = cluster_col_map[cl[i]]; } } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; /* Count cells in each cluster @@ -201,27 +245,15 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVec NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); std::vector workspace_i(ptr->get_nrow()); - - #if defined(_OPENMP) - #pragma omp parallel num_threads(ncores) - #pragma omp for - #endif + - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ - // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) - continue; - - // loop over col_i-th column of mat matrix - auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - res(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); - } - } + // column mean sparse functor (pass input and output matrixes) + auto matrix_ptr = ptr.get(); + ColumnMeanSparse column_mean_sparse(matrix_ptr, mat_cluster_vector, cl, res); + + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_mean_sparse,20); + // loop over columns of res matrix, and divide by number of cells in each cluster @@ -230,6 +262,7 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVec col = col / cluster_id_number[i]; } colnames(res) = colnames_vec; + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); @@ -250,7 +283,8 @@ Rcpp::NumericMatrix rcpp_get_cl_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVec //[[Rcpp::export]] Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth){ - // call R function to find positions of each cell in matrix + + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -276,7 +310,8 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -296,7 +331,6 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c mat_cluster_vector[i] = cluster_col_map[cl[i]]; } } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; /* Count cells in each cluster @@ -324,8 +358,8 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c // loop over col_i-th column of mat matrix auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices + auto xptr = indices.x; + auto iptr = indices.i; auto nnzero = indices.n; for (int row_i = 0; row_i < nnzero; row_i++){ @@ -344,6 +378,7 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c col = col / cluster_id_number[i]; } colnames(res) = colnames_vec; + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); @@ -359,15 +394,66 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c ////////////////////////////////////////////////////////////////////////////////////////////////////// -// get_cl_present method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +// get_cl_present method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// +/*To use parallelFor, create a Worker object that defines an operator() which is called by the parallel scheduler.*/ +struct ColumnPresentSparse : public Worker +{ + // source matrix and maps + beachmat::lin_sparse_matrix* matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + + double lowth; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnPresentSparse(beachmat::lin_sparse_matrix* matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + double lowth, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), lowth(lowth), output(output) {} + + // get the column sum of the given cols + void operator()(std::size_t begin, std::size_t end) { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++){ -/*The function calls the ColumnMeanSparse*/ + if (cl[col_i] < 1) + continue; + + + // loop over col_i-th column of mat matrix + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + if(*(xptr+row_i) < lowth) + continue; + + output(*(iptr+row_i), mat_cluster_vector[col_i]) += 1.0; + } + + } + } +}; + + +/*The function calls the ColumnPresentSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth, int ncores){ - // call R function to reorder and subset cluster vector +Rcpp::NumericMatrix rcpp_get_cl_present_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth){ + + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -393,7 +479,8 @@ Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerV } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -413,11 +500,10 @@ Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerV mat_cluster_vector[i] = cluster_col_map[cl[i]]; } } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; /* Count cells in each cluster - unique_clusters = number of clusters = 10 + unique_clusters = number of clusters cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); @@ -434,38 +520,23 @@ Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerV NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); std::vector workspace_i(ptr->get_nrow()); - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ - // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) - continue; - - // loop over col_i-th column of mat matrix - auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices - auto nnzero = indices.n; - - #if defined(_OPENMP) - #pragma omp parallel num_threads(ncores) - #pragma omp for - #endif - - for (int row_i = 0; row_i < nnzero; row_i++){ - - if(*(xptr+row_i) < lowth) - continue; - - res(*(iptr+row_i), mat_cluster_vector[col_i]) += 1; - } - } + // column mean sparse functor (pass input and output matrixes) + auto matrix_ptr = ptr.get(); + ColumnPresentSparse column_present_sparse(matrix_ptr, mat_cluster_vector, cl, lowth, res); + + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_present_sparse, 20); + + // loop over columns of res matrix, and divide by number of cells in each cluster for (int i = 0; i < res.ncol(); i++){ NumericMatrix::Column col = res( _ , i); col = col / cluster_id_number[i]; } colnames(res) = colnames_vec; + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); @@ -488,7 +559,8 @@ Rcpp::NumericMatrix rcpp_get_cl_present_openMP(Rcpp::RObject mat, Rcpp::IntegerV //[[Rcpp::export]] Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - // call R function to find positions of each cell in matrix + + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -514,7 +586,8 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -534,7 +607,6 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector mat_cluster_vector[i] = cluster_col_map[cl[i]]; } } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; /* Count cells in each cluster @@ -589,21 +661,59 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector - - - - - ////////////////////////////////////////////////////////////////////////////////////////////////////// -// get_cl_sq_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using openMP +// get_cl_sq_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// +struct ColumnSqrMeansSparse : public Worker +{ + // source matrix and maps + beachmat::lin_sparse_matrix* matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnSqrMeansSparse(beachmat::lin_sparse_matrix* matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} + + // get the column sum of the given cols + void operator()(std::size_t begin, std::size_t end) { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++){ + + if (cl[col_i] < 1) + continue; + + + // loop over col_i-th column of mat matrix + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + output(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); + } + + } + } +}; -/*The function calls the ColumnMeanSparse*/ +/*The function calls the ColumnSqrMeansSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_sqr_means_openMP(Rcpp::RObject mat, Rcpp::IntegerVector clAll, int ncores){ - // call R function to reorder and subset cluster vector +Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ + + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); @@ -629,7 +739,8 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means_openMP(Rcpp::RObject mat, Rcpp::Intege } - /* Set up hash maps for column cluster lookup: mat_cluster_map is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ @@ -670,28 +781,17 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means_openMP(Rcpp::RObject mat, Rcpp::Intege NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); std::vector workspace_i(ptr->get_nrow()); - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ - // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) - continue; - - // loop over col_i-th column of mat matrix - auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices - auto nnzero = indices.n; - - #if defined(_OPENMP) - #pragma omp parallel num_threads(ncores) - #pragma omp for - #endif + + // column mean sparse functor (pass input and output matrixes) + auto matrix_ptr = ptr.get(); + ColumnSqrMeansSparse column_sqr_means_sparse(matrix_ptr, mat_cluster_vector, cl, res); - for (int row_i = 0; row_i < nnzero; row_i++){ - - - res(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); - } - } + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_sqr_means_sparse,20); + + + + // loop over columns of res matrix, and divide by number of cells in each cluster @@ -710,4 +810,296 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means_openMP(Rcpp::RObject mat, Rcpp::Intege -} \ No newline at end of file +} + + + + +////////////////////////////////////////////////////////////////////////////////// +// get_cl_median method1: iterate over only the non-zero elements in a column in a sparse matrix +////////////////////////////////////////////////////////////////////////////////// + +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_medians(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name);//cl_pos is the position number of cl_all_cl_name in the count matrix + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + /* Set up hash map: cluster_col_pos_map is the map for vector of position in each cluster*/ + std::unordered_map> cluster_col_pos_map; + for(int i = 0; i < cl.size(); i++) { + + if (cl[i] < 1) + continue; + + cluster_col_pos_map[cl[i]].push_back(i); + + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster the column number in res matrix + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + + /* Loop through cluster_col_pos_map and create vector of vector*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), cluster_col_pos_map.size()); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + + + + + + for(auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) { + auto cluster_id = it->first; + auto pos_vec = it->second; + + + std::vector> sub_mat(ptr->get_nrow()); + for (auto pos_i : pos_vec) { + // loop over col_i-th column of sub mat matrix + auto indices = ptr->get_col(pos_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + sub_mat[*(iptr+row_i)].push_back(*(xptr+row_i)); + } + } + + size_t n = pos_vec.size() / 2; + + for(int i=0; i> sub_mat; + + std::vector mat_cluster_vector; + + std::vector pos_vec; + + size_t n; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnMedianSparse(std::vector> sub_mat, + std::vector mat_cluster_vector, + std::vector pos_vec, + size_t n, + NumericMatrix output) + : sub_mat(sub_mat), mat_cluster_vector(mat_cluster_vector), pos_vec(pos_vec), n(n), output(output) {} + + // get the column sum of the given cols + + void operator()(std::size_t begin, std::size_t end) { + + + for(int i = begin; i < end; i++){ + sub_mat[i].resize(pos_vec.size(), 0); + + std::nth_element(sub_mat[i].begin(), sub_mat[i].begin()+n, sub_mat[i].end()); + double vn = sub_mat[i][n]; + + if(pos_vec.size() % 2 == 1){ + + output(i, mat_cluster_vector[pos_vec[0]]) = vn; + }else{ + + std::nth_element(sub_mat[i].begin(), sub_mat[i].begin()+n-1, sub_mat[i].end()); + output(i, mat_cluster_vector[pos_vec[0]]) = 0.5*(vn+sub_mat[i][n-1]); + + } + + } + } + + + +}; + + + +//[[Rcpp::export]] +Rcpp::NumericMatrix rcpp_get_cl_medians_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ + // call R function to find positions of each cell in matrix + Function colnames_f("colnames"); + CharacterVector mat_name = colnames_f(mat); + + Function names_f("names"); + CharacterVector cl_all_cl_name = names_f(clAll); + + Function match_f("match"); + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name);//cl_pos is the position number of cl_all_cl_name in the count matrix + + CharacterVector levs_all = clAll.attr("levels"); + std::unordered_map cluster_col_name_id_map; + std::unordered_map cluster_col_name_lev_map; + + for(int i = 0; i < clAll.length(); i++) { + cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; + cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); + } + std::vector cl(mat_name.length(), 0); + CharacterVector cl_colnames_vec(mat_name.length()); + for(int i = 0; i < cl_pos.length(); i++) { + cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; + cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + } + + /* Set up hash map: cluster_col_pos_map is the map for vector of position in each cluster*/ + std::unordered_map> cluster_col_pos_map; + for(int i = 0; i < cl.size(); i++) { + + if (cl[i] < 1) + continue; + + cluster_col_pos_map[cl[i]].push_back(i); + + } + + + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, + cluster_col_map is for each cluster the column number in res matrix + levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" + colnames_vec is the ordered cluster id: "1" "23" "2" "3" "9" "5" "6" "4" "7" "8"*/ + + std::vector mat_cluster_vector(cl.size(), 0); + std::unordered_map cluster_col_map; + int col_id = 0; + CharacterVector colnames_vec; + for(int i = 0; i < cl.size(); i++){ + if (cl[i] < 1) + continue; + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + cluster_col_map[cl[i]] = col_id; + mat_cluster_vector[i] = col_id; + col_id++; + colnames_vec.push_back(cl_colnames_vec[i]); + } else { + mat_cluster_vector[i] = cluster_col_map[cl[i]]; + } + } + + /* Loop through cluster_col_pos_map and create vector of vector*/ + auto ptr = beachmat::read_lin_sparse_block(mat); + NumericMatrix res(ptr->get_nrow(), cluster_col_pos_map.size()); + std::vector workspace_x(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); + + + + for(auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) { + auto cluster_id = it->first; + auto pos_vec = it->second; + + + std::vector> sub_mat(ptr->get_nrow()); + for (auto pos_i : pos_vec) { + // loop over col_i-th column of sub mat matrix + auto indices = ptr->get_col(pos_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++){ + + sub_mat[*(iptr+row_i)].push_back(*(xptr+row_i)); + } + } + + size_t n = pos_vec.size() / 2; + + // column mean sparse functor (pass input and output matrixes) + + ColumnMedianSparse column_median_sparse(sub_mat, mat_cluster_vector, pos_vec, n, res); + + // call parallelFor to do the work + parallelFor(0, sub_mat.size(), column_median_sparse); + + + } + + colnames(res) = colnames_vec; + // call R function to read and assign rownames + Function rownames_f("rownames"); + rownames(res) = rownames_f(mat); + return res; +} From 7c2559a71a1d55051eee03c4c55529115c209db7 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 16 Jun 2021 13:34:36 -0400 Subject: [PATCH 60/70] modify debug info --- R/annotate.R | 2 + R/harmonize.R | 107 ++++++++++++++++++++++++++++++++++++++++---------- R/markers.R | 2 +- R/util.R | 31 ++++++++++++--- 4 files changed, 115 insertions(+), 27 deletions(-) diff --git a/R/annotate.R b/R/annotate.R index 80680ef..6262dd5 100644 --- a/R/annotate.R +++ b/R/annotate.R @@ -402,6 +402,8 @@ compare_annotate <- function(cl, } else{ ref.cl <- setNames(factor(ref.cl), names(ref.cl)) + ref.cl.df = data.frame(cluster_id = levels(ref.cl), cluster_label=levels(ref.cl)) + row.names(ref.cl.df) = levels(ref.cl) } } diff --git a/R/harmonize.R b/R/harmonize.R index cec84cd..cb8c87d 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -120,7 +120,8 @@ sample_sets_list <- function(cells.list, cl.list, cl.sample.size=100, sample.siz if(is.factor(tmp.cl)){ tmp.cl = droplevels(tmp.cl) } - cells.list[[x]] = sample_cells(tmp.cl, max(cl.sample.size,round(sample.size/length(unique(tmp.cl))))) + cl.size = table(tmp.cl) + cells.list[[x]] = sample_cells(tmp.cl, max(cl.sample.size,round(sample.size/sum(cl.size >= 4)))) } } } @@ -157,7 +158,49 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) results= foreach(i=1:length(bins), .combine=.combine) %dopar% FUN(bins[[i]],...) return(results) } + +pvec_no_combine <- function (v, FUN, ..., mc.set.seed = TRUE, mc.silent = FALSE, + mc.cores = getOption("mc.cores", 2L), mc.cleanup = TRUE) +{ + if (!is.vector(v)) + stop("'v' must be a vector") + cores <- as.integer(mc.cores) + if (cores < 1L) + stop("'mc.cores' must be >= 1") + if (cores == 1L) + return(FUN(v, ...)) + if (mc.set.seed) + mc.reset.stream() + n <- length(v) + l <- if (n <= cores) + as.list(v) + else { + il <- as.integer(n/cores) + xc <- n - il * cores + sl <- rep(il, cores) + if (xc) + sl[1:xc] <- il + 1L + si <- cumsum(c(1L, sl)) + se <- si + c(sl, 0L) - 1L + lapply(seq_len(cores), function(ix) v[si[ix]:se[ix]]) + } + jobs <- NULL + prepareCleanup() + on.exit(cleanup()) + FUN <- match.fun(FUN) + jobs <- lapply(seq_len(min(n, cores)), function(i) mcparallel(FUN(l[[i]], + ...), name = i, mc.set.seed = mc.set.seed, silent = mc.silent)) + res <- mccollect(jobs) + names(res) <- NULL + return(res) + } +knn_combine <- function(results) +{ + knn.index = do.call("rbind", lapply(results, function(x)x[[1]])) + knn.distance = do.call("rbind", lapply(results, function(x)x[[2]])) + return(list(knn.index, knn.distance)) +} #' get knn batch #' @@ -173,13 +216,20 @@ batch_process <- function(x, batch.size, FUN, mc.cores=1, .combine="c",...) #' @export #' #' @examples -get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1,...) +get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, mc.cores=1,return.distance=FALSE,...) { - results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine="rbind", FUN=function(bin){ - get_knn(dat=dat[,bin,drop=F], ref.dat=ref.dat, k=k, method=method, dim=dim,...) + if(return.distance){ + fun = "knn_combine" + } + else{ + fun = "rbind" + } + results <- batch_process(x=1:ncol(dat), batch.size=batch.size, mc.cores=mc.cores, .combine=fun, FUN=function(bin){ + get_knn(dat=dat[,bin,drop=F], ref.dat=ref.dat, k=k, method=method, dim=dim,return.distance=return.distance, ...) }) return(results) } + @@ -195,16 +245,23 @@ get_knn_batch <- function(dat, ref.dat, k, method="cor", dim=NULL, batch.size, m #' @export #' #' @examples -get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transposed=TRUE) +get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transposed=TRUE, return.distance=FALSE) { + if(transposed){ + cell.id = colnames(dat) + } + else{ + cell.id= row.names(dat) + } + if(method=="cor"){ if(transposed){ - knn.index = knn_cor(ref.dat, dat,k=k) + knn.result = knn_cor(ref.dat, dat,k=k) } else{ ref.dat = Matrix::t(ref.dat) dat = Matrix::t(dat) - knn.index = knn_cor(ref.dat, dat,k=k) + knn.result = knn_cor(ref.dat, dat,k=k) } } else{ @@ -215,30 +272,39 @@ get_knn <- function(dat, ref.dat, k, method ="cor", dim=NULL,index=NULL, transpo dat = Matrix::t(dat) } if(method=="RANN"){ - knn.index = RANN::nn2(ref.dat, dat, k=k)[[1]] + knn.result = RANN::nn2(ref.dat, dat, k=k) } if(method %in% c("Annoy.Euclidean", "Annoy.Cosine")){ library(BiocNeighbors) if(is.null(index)){ if (method=="Annoy.Cosine"){ - ref.dat = l2norm(ref.dat,transposed=FALSE) - dat = l2norm(dat,transposed=FALSE) + ref.dat = l2norm(ref.dat,by = "row") } index= buildAnnoy(ref.dat) } - knn.index = queryAnnoy(X= ref.dat, query=dat, k=k, precomputed = index)[[1]] + if (method=="Annoy.Cosine"){ + dat = l2norm(dat,by="row") + } + knn.result = queryAnnoy(X= ref.dat, query=dat, k=k, precomputed = index) } else if(method == "CCA"){ mat3 = crossprod(ref.dat, dat) cca.svd <- irlba(mat3, dim=dim) - knn.index = knn_cor(cca.svd$u, cca.svd$v, k=k) + knn.result = knn_cor(cca.svd$u, cca.svd$v, k=k) } else{ stop(paste(method, "method unknown")) } } - row.names(knn.index) = row.names(dat) - return(knn.index) + knn.index= knn.result[[1]] + knn.distance = knn.result[[2]] + row.names(knn.index) = row.names(knn.distance)=cell.id + if(!return.distance){ + return(knn.index) + } + else{ + list(index=knn.index, distance=knn.distance) + } } @@ -485,6 +551,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= return(NULL) } sampled.cells = unlist(cells.list) + result = knn_jaccard_clust(knn.comb[sampled.cells,], method=method) result$knn = knn.comb ###preliminary clusters from louvain or leiden @@ -546,8 +613,9 @@ sim_knn <- function(sim, k=15) require(matrixStats) th = rowOrderStats(as.matrix(sim), which=ncol(sim)-k+1) select = sim >= th - knn.idx = t(apply(select, 1, function(x)head(which(x),k))) - return(knn.idx) + knn.index = t(apply(select, 1, function(x)head(which(x),k))) + knn.distance = do.call("rbind",lapply(1:nrow(sim), function(i) (1- sim[i,,drop=F])[knn.index[i,,drop=F]])) + return(list(knn.index, knn.distance)) } #' KNN cor @@ -565,8 +633,7 @@ knn_cor <- function(ref.dat, query.dat, k = 15) #sim = cor(as.matrix(query.dat), as.matrix(ref.dat), use="pairwise.complete.obs") sim = cor(as.matrix(query.dat), as.matrix(ref.dat)) sim[is.na(sim)] = 0 - knn.idx = sim_knn(sim, k=k) - return(knn.idx) + return(sim_knn(sim, k=k)) } #' KNN cosine @@ -607,7 +674,7 @@ knn_cosine <- function(ref.dat, query.dat, k = 15) ##' @param prune ##' @return ##' @author Zizhen Yao -knn_jaccard_clust <- function(knn.index, method=c("louvain","leiden"),prune=0.05) +knn_jaccard_clust <- function(knn.index, method=c("louvain","leiden"),prune=0.05,...) { require(igraph) cat("Get jaccard\n") @@ -623,7 +690,7 @@ knn_jaccard_clust <- function(knn.index, method=c("louvain","leiden"),prune=0.05 else{ cat("Leiden clustering\n") library(leidenAlg) - result <- leiden.community(gr) + result <- leiden.community(gr,...) } result$cl=membership(result) return(result) diff --git a/R/markers.R b/R/markers.R index c592ea8..4a29ba6 100644 --- a/R/markers.R +++ b/R/markers.R @@ -224,7 +224,7 @@ select_markers_pair_direction <- function(de.genes, add.up,add.down,cl.means, up } final.genes=c(final.genes, g) select.genes = setdiff(select.genes, final.genes) - cat(g, length(add.up), length(add.down),"\n") + cat(g, length(add.up), length(add.down),length(select.genes),"\n") } markers= final.genes return(list(markers=markers, up.genes=up.genes, down.genes=down.genes)) diff --git a/R/util.R b/R/util.R index c1a3256..b71a58b 100644 --- a/R/util.R +++ b/R/util.R @@ -629,19 +629,38 @@ filter_by_size <- function(cat, min.size) } } -l2norm <- function(X, transposed=TRUE) +l2norm <- function(X, by="column") { - if (transposed) { - l2norm <- sqrt(colSums(X^2)) + if (by=="column") { + l2norm <- sqrt(Matrix::colSums(X^2)) if (any(l2norm==0)) { stop("L2 norms of zero detected for distance='Cosine'") } - sweep(X, 2, l2norm, "/", check.margin=FALSE) + X=sweep(X, 2, l2norm, "/", check.margin=FALSE) + X = X } else { - l2norm <- sqrt(rowSums(X^2)) + l2norm <- sqrt(Matrix::rowSums(X^2)) if (any(l2norm==0)) { stop("L2 norms of zero detected for distance='Cosine'") } - X/l2norm + X= X/l2norm } } + + +standardize <- function(X, by="column") +{ + if(by=="column"){ + mean = Matrix::colMeans(X) + X=sweep(X, 2, mean, "-") + sd = sqrt(Matrix::colSums(X^2)/nrow(X)) + X = sweep(X, 2, sd, "/") + } + else{ + mean = Matrix::rowMeans(X) + X=sweep(X, 1, mean, "-") + sd = sqrt(Matrix::rowSums(X^2)/ncol(X)) + X = sweep(X, 1, sd, "/") + } +} + From 872555bcd88b2b980e38b9022b4878d7aa306917 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Wed, 16 Jun 2021 11:01:11 -0700 Subject: [PATCH 61/70] Link Rcpp file and unify indent --- R/RcppExports.R | 32 ++ src/RcppExports.cpp | 108 +++- src/Rcpp_parallel.cpp | 1104 ++++++++++++++++++++--------------------- 3 files changed, 685 insertions(+), 559 deletions(-) diff --git a/R/RcppExports.R b/R/RcppExports.R index 677c970..b85595d 100644 --- a/R/RcppExports.R +++ b/R/RcppExports.R @@ -1,6 +1,38 @@ # Generated by using Rcpp::compileAttributes() -> do not edit by hand # Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 +rcpp_get_cl_means <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_means', PACKAGE = 'scrattch.hicat', mat, clAll) +} + +rcpp_get_cl_means_RcppParallel <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_means_RcppParallel', PACKAGE = 'scrattch.hicat', mat, clAll) +} + +rcpp_get_cl_present <- function(mat, clAll, lowth) { + .Call('_scrattch_hicat_rcpp_get_cl_present', PACKAGE = 'scrattch.hicat', mat, clAll, lowth) +} + +rcpp_get_cl_present_RcppParallel <- function(mat, clAll, lowth) { + .Call('_scrattch_hicat_rcpp_get_cl_present_RcppParallel', PACKAGE = 'scrattch.hicat', mat, clAll, lowth) +} + +rcpp_get_cl_sqr_means <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_sqr_means', PACKAGE = 'scrattch.hicat', mat, clAll) +} + +rcpp_get_cl_sqr_means_RcppParallel <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_sqr_means_RcppParallel', PACKAGE = 'scrattch.hicat', mat, clAll) +} + +rcpp_get_cl_medians <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_medians', PACKAGE = 'scrattch.hicat', mat, clAll) +} + +rcpp_get_cl_medians_RcppParallel <- function(mat, clAll) { + .Call('_scrattch_hicat_rcpp_get_cl_medians_RcppParallel', PACKAGE = 'scrattch.hicat', mat, clAll) +} + RowMergeMatrices <- function(mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) { .Call('_scrattch_hicat_RowMergeMatrices', PACKAGE = 'scrattch.hicat', mat1, mat2, mat1_rownames, mat2_rownames, all_rownames) } diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp index 5a7beae..5c3e6ef 100644 --- a/src/RcppExports.cpp +++ b/src/RcppExports.cpp @@ -1,11 +1,109 @@ // Generated by using Rcpp::compileAttributes() -> do not edit by hand // Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 -#include #include +#include using namespace Rcpp; +// rcpp_get_cl_means +Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_means(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_means(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_means_RcppParallel +Rcpp::NumericMatrix rcpp_get_cl_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_means_RcppParallel(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_means_RcppParallel(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_present +Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_present(SEXP matSEXP, SEXP clAllSEXP, SEXP lowthSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + Rcpp::traits::input_parameter< double >::type lowth(lowthSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_present(mat, clAll, lowth)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_present_RcppParallel +Rcpp::NumericMatrix rcpp_get_cl_present_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_present_RcppParallel(SEXP matSEXP, SEXP clAllSEXP, SEXP lowthSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + Rcpp::traits::input_parameter< double >::type lowth(lowthSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_present_RcppParallel(mat, clAll, lowth)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_sqr_means +Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_sqr_means(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_sqr_means(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_sqr_means_RcppParallel +Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_sqr_means_RcppParallel(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_sqr_means_RcppParallel(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_medians +Rcpp::NumericMatrix rcpp_get_cl_medians(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_medians(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_medians(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} +// rcpp_get_cl_medians_RcppParallel +Rcpp::NumericMatrix rcpp_get_cl_medians_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll); +RcppExport SEXP _scrattch_hicat_rcpp_get_cl_medians_RcppParallel(SEXP matSEXP, SEXP clAllSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< Rcpp::RObject >::type mat(matSEXP); + Rcpp::traits::input_parameter< Rcpp::IntegerVector >::type clAll(clAllSEXP); + rcpp_result_gen = Rcpp::wrap(rcpp_get_cl_medians_RcppParallel(mat, clAll)); + return rcpp_result_gen; +END_RCPP +} // RowMergeMatrices Eigen::SparseMatrix RowMergeMatrices(Eigen::SparseMatrix mat1, Eigen::SparseMatrix mat2, std::vector< std::string > mat1_rownames, std::vector< std::string > mat2_rownames, std::vector< std::string > all_rownames); RcppExport SEXP _scrattch_hicat_RowMergeMatrices(SEXP mat1SEXP, SEXP mat2SEXP, SEXP mat1_rownamesSEXP, SEXP mat2_rownamesSEXP, SEXP all_rownamesSEXP) { @@ -268,6 +366,14 @@ END_RCPP } static const R_CallMethodDef CallEntries[] = { + {"_scrattch_hicat_rcpp_get_cl_means", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_means, 2}, + {"_scrattch_hicat_rcpp_get_cl_means_RcppParallel", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_means_RcppParallel, 2}, + {"_scrattch_hicat_rcpp_get_cl_present", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_present, 3}, + {"_scrattch_hicat_rcpp_get_cl_present_RcppParallel", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_present_RcppParallel, 3}, + {"_scrattch_hicat_rcpp_get_cl_sqr_means", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_sqr_means, 2}, + {"_scrattch_hicat_rcpp_get_cl_sqr_means_RcppParallel", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_sqr_means_RcppParallel, 2}, + {"_scrattch_hicat_rcpp_get_cl_medians", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_medians, 2}, + {"_scrattch_hicat_rcpp_get_cl_medians_RcppParallel", (DL_FUNC) &_scrattch_hicat_rcpp_get_cl_medians_RcppParallel, 2}, {"_scrattch_hicat_RowMergeMatrices", (DL_FUNC) &_scrattch_hicat_RowMergeMatrices, 5}, {"_scrattch_hicat_RowMergeMatricesList", (DL_FUNC) &_scrattch_hicat_RowMergeMatricesList, 3}, {"_scrattch_hicat_LogNorm", (DL_FUNC) &_scrattch_hicat_LogNorm, 3}, diff --git a/src/Rcpp_parallel.cpp b/src/Rcpp_parallel.cpp index 7491903..497e723 100644 --- a/src/Rcpp_parallel.cpp +++ b/src/Rcpp_parallel.cpp @@ -13,40 +13,40 @@ using namespace Rcpp; using namespace RcppParallel; - - /////////////////////////////////////////////////////////////////////////////////////////////// // get_cl_means method1: iterate over only the non-zero elements in a column in a sparse matrix /////////////////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - // call R function to find positions of each cell in matrix +Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector clAll_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(clAll_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(clAll_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(clAll_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -56,75 +56,73 @@ Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clA std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++) + { // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) + if (cl[col_i] < 1) continue; - + // loop over col_i-th column of mat matrix auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; - auto iptr = indices.i; - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - res(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++) + { + res(*(iptr + row_i), mat_cluster_vector[col_i]) += *(xptr + row_i); } } - - + // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } colnames(res) = colnames_vec; // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; + return res; } - - - - - - - - ////////////////////////////////////////////////////////////////////////////////////////////////////// // get_cl_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -133,77 +131,78 @@ Rcpp::NumericMatrix rcpp_get_cl_means(Rcpp::RObject mat, Rcpp::IntegerVector clA struct ColumnMeanSparse : public Worker { - // source matrix and maps - beachmat::lin_sparse_matrix* matrix_ptr; - - std::vector mat_cluster_vector; - - std::vector cl; - // destination matrix - RMatrix output; - - // initialize with source and destination - ColumnMeanSparse(beachmat::lin_sparse_matrix* matrix_ptr, - std::vector mat_cluster_vector, - std::vector cl, - NumericMatrix output) - : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} - - // get the row sum of the given cols - void operator()(std::size_t begin, std::size_t end) { - std::vector workspace_x(matrix_ptr->get_nrow()); - std::vector workspace_i(matrix_ptr->get_nrow()); - for (int col_i = begin; col_i < end; col_i++){ - - if (cl[col_i] < 1) - continue; - - - // loop over col_i-th column of mat matrix - auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; - auto iptr = indices.i; - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - output(*(iptr+row_i), mat_cluster_vector[col_i]) += *(xptr+row_i); - } - - } - } -}; + // source matrix and maps + beachmat::lin_sparse_matrix *matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + // destination matrix + RMatrix output; + + // initialize with source and destination + ColumnMeanSparse(beachmat::lin_sparse_matrix *matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} + + // get the row sum of the given cols + void operator()(std::size_t begin, std::size_t end) + { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++) + { + + if (cl[col_i] < 1) + continue; + // loop over col_i-th column of mat matrix + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + for (int row_i = 0; row_i < nnzero; row_i++) + { + output(*(iptr + row_i), mat_cluster_vector[col_i]) += *(xptr + row_i); + } + } + } +}; /*The function calls the ColumnMeanSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - // call R function to find positions of each cell in matrix +Rcpp::NumericMatrix rcpp_get_cl_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector clAll_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(clAll_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(clAll_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(clAll_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -213,103 +212,99 @@ Rcpp::NumericMatrix rcpp_get_cl_means_RcppParallel(Rcpp::RObject mat, Rcpp::Inte std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters = 10 cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); + std::vector workspace_i(ptr->get_nrow()); - // column mean sparse functor (pass input and output matrixes) - auto matrix_ptr = ptr.get(); - ColumnMeanSparse column_mean_sparse(matrix_ptr, mat_cluster_vector, cl, res); - - // call parallelFor to do the work - parallelFor(0, ptr->get_ncol(), column_mean_sparse,20); - - - + auto matrix_ptr = ptr.get(); + ColumnMeanSparse column_mean_sparse(matrix_ptr, mat_cluster_vector, cl, res); + + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_mean_sparse, 20); + // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } colnames(res) = colnames_vec; - + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; - - + return res; } - - - - - - ////////////////////////////////////////////////////////////////////////////////// // get_cl_present method1: iterate over only the non-zero elements in a column in a sparse matrix ////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth){ - +Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -319,80 +314,78 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters = 10 cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++) + { // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) + if (cl[col_i] < 1) continue; - + // loop over col_i-th column of mat matrix auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; - auto iptr = indices.i; - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - if(*(xptr+row_i) < lowth) + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + if (*(xptr + row_i) < lowth) continue; - - res(*(iptr+row_i), mat_cluster_vector[col_i]) += 1.0; + + res(*(iptr + row_i), mat_cluster_vector[col_i]) += 1.0; } } - - + // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } colnames(res) = colnames_vec; - + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; + return res; } - - - - - - - - ////////////////////////////////////////////////////////////////////////////////////////////////////// // get_cl_present method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -401,84 +394,86 @@ Rcpp::NumericMatrix rcpp_get_cl_present(Rcpp::RObject mat, Rcpp::IntegerVector c struct ColumnPresentSparse : public Worker { - // source matrix and maps - beachmat::lin_sparse_matrix* matrix_ptr; - - std::vector mat_cluster_vector; - - std::vector cl; - - double lowth; - // destination matrix - RMatrix output; - - // initialize with source, cl_id and destination - ColumnPresentSparse(beachmat::lin_sparse_matrix* matrix_ptr, - std::vector mat_cluster_vector, - std::vector cl, - double lowth, - NumericMatrix output) - : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), lowth(lowth), output(output) {} - - // get the column sum of the given cols - void operator()(std::size_t begin, std::size_t end) { - std::vector workspace_x(matrix_ptr->get_nrow()); - std::vector workspace_i(matrix_ptr->get_nrow()); - for (int col_i = begin; col_i < end; col_i++){ - - if (cl[col_i] < 1) - continue; - - - // loop over col_i-th column of mat matrix - auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; - auto iptr = indices.i; - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - if(*(xptr+row_i) < lowth) + // source matrix and maps + beachmat::lin_sparse_matrix *matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + + double lowth; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnPresentSparse(beachmat::lin_sparse_matrix *matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + double lowth, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), lowth(lowth), output(output) {} + + // get the column sum of the given cols + void operator()(std::size_t begin, std::size_t end) + { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++) + { + + if (cl[col_i] < 1) continue; - - output(*(iptr+row_i), mat_cluster_vector[col_i]) += 1.0; + + // loop over col_i-th column of mat matrix + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; + auto iptr = indices.i; + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + if (*(xptr + row_i) < lowth) + continue; + + output(*(iptr + row_i), mat_cluster_vector[col_i]) += 1.0; + } } - - } - } + } }; - /*The function calls the ColumnPresentSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_present_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth){ - +Rcpp::NumericMatrix rcpp_get_cl_present_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll, double lowth) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -488,104 +483,99 @@ Rcpp::NumericMatrix rcpp_get_cl_present_RcppParallel(Rcpp::RObject mat, Rcpp::In std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - - + std::vector workspace_i(ptr->get_nrow()); + // column mean sparse functor (pass input and output matrixes) - auto matrix_ptr = ptr.get(); - ColumnPresentSparse column_present_sparse(matrix_ptr, mat_cluster_vector, cl, lowth, res); - - // call parallelFor to do the work - parallelFor(0, ptr->get_ncol(), column_present_sparse, 20); - + auto matrix_ptr = ptr.get(); + ColumnPresentSparse column_present_sparse(matrix_ptr, mat_cluster_vector, cl, lowth, res); + + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_present_sparse, 20); // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } colnames(res) = colnames_vec; - + // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; - - - - - - + return res; } - - - - ////////////////////////////////////////////////////////////////////////////////// // get_cl_sq_means method1: iterate over only the non-zero elements in a column in a sparse matrix ////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - +Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -595,150 +585,154 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters = 10 cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - for (int col_i = 0; col_i < ptr->get_ncol(); col_i++){ + std::vector workspace_i(ptr->get_nrow()); + for (int col_i = 0; col_i < ptr->get_ncol(); col_i++) + { // skip the column if it doesn't exist in clAll - if (cl[col_i] < 1) + if (cl[col_i] < 1) continue; - + // loop over col_i-th column of mat matrix auto indices = ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - - res(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + res(*(iptr + row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr + row_i)); } } - - + // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } colnames(res) = colnames_vec; // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; + return res; } - - - ////////////////////////////////////////////////////////////////////////////////////////////////////// // get_cl_sq_means method2: iterate over only the non-zero elements in a column in a sparse matrix, using RcppParallel ////////////////////////////////////////////////////////////////////////////////////////////////////// struct ColumnSqrMeansSparse : public Worker { - // source matrix and maps - beachmat::lin_sparse_matrix* matrix_ptr; - - std::vector mat_cluster_vector; - - std::vector cl; - // destination matrix - RMatrix output; - - // initialize with source, cl_id and destination - ColumnSqrMeansSparse(beachmat::lin_sparse_matrix* matrix_ptr, - std::vector mat_cluster_vector, - std::vector cl, - NumericMatrix output) - : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} - - // get the column sum of the given cols - void operator()(std::size_t begin, std::size_t end) { - std::vector workspace_x(matrix_ptr->get_nrow()); - std::vector workspace_i(matrix_ptr->get_nrow()); - for (int col_i = begin; col_i < end; col_i++){ - - if (cl[col_i] < 1) - continue; - - + // source matrix and maps + beachmat::lin_sparse_matrix *matrix_ptr; + + std::vector mat_cluster_vector; + + std::vector cl; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnSqrMeansSparse(beachmat::lin_sparse_matrix *matrix_ptr, + std::vector mat_cluster_vector, + std::vector cl, + NumericMatrix output) + : matrix_ptr(matrix_ptr), mat_cluster_vector(mat_cluster_vector), cl(cl), output(output) {} + + // get the column sum of the given cols + void operator()(std::size_t begin, std::size_t end) + { + std::vector workspace_x(matrix_ptr->get_nrow()); + std::vector workspace_i(matrix_ptr->get_nrow()); + for (int col_i = begin; col_i < end; col_i++) + { + + if (cl[col_i] < 1) + continue; + // loop over col_i-th column of mat matrix - auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; // row values - auto iptr = indices.i; // row indices - auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - output(*(iptr+row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr+row_i)); + auto indices = matrix_ptr->get_col(col_i, workspace_x.data(), workspace_i.data()); + auto xptr = indices.x; // row values + auto iptr = indices.i; // row indices + auto nnzero = indices.n; + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + output(*(iptr + row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr + row_i)); + } } - - } - } + } }; - /*The function calls the ColumnSqrMeansSparse*/ //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ +Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ - // call R function to find positions of each cell in matrix + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); - + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } - /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -748,116 +742,109 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp:: std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - //Rcout << "cluster_col_map " << cluster_col_map.size() <<"\n"; - - - /* Count cells in each cluster + } + + /* Count cells in each cluster unique_clusters = number of clusters = 10 cluster_id_number = number of cells in each cluster correspond to colnames_vec */ int unique_clusters = cluster_col_map.size(); std::vector cluster_id_number(unique_clusters, 0); - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; cluster_id_number[cluster_col_map[cl[i]]]++; } - + /* Loop though sparse matrix and access non-zero entry res is the matrix to store sum valuse in each cluster, dim=number of genes*number of clusters loop through each column of the sparse matrix mat. For each non-zero entry, find its cluster and column in res, add into the value*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), unique_clusters); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - + std::vector workspace_i(ptr->get_nrow()); + // column mean sparse functor (pass input and output matrixes) - auto matrix_ptr = ptr.get(); - ColumnSqrMeansSparse column_sqr_means_sparse(matrix_ptr, mat_cluster_vector, cl, res); - - // call parallelFor to do the work - parallelFor(0, ptr->get_ncol(), column_sqr_means_sparse,20); - - - - - - + auto matrix_ptr = ptr.get(); + ColumnSqrMeansSparse column_sqr_means_sparse(matrix_ptr, mat_cluster_vector, cl, res); + + // call parallelFor to do the work + parallelFor(0, ptr->get_ncol(), column_sqr_means_sparse, 20); + // loop over columns of res matrix, and divide by number of cells in each cluster - for (int i = 0; i < res.ncol(); i++){ - NumericMatrix::Column col = res( _ , i); - col = col / cluster_id_number[i]; - } + for (int i = 0; i < res.ncol(); i++) + { + NumericMatrix::Column col = res(_, i); + col = col / cluster_id_number[i]; + } + colnames(res) = colnames_vec; // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; - - - - - - + return res; } - - - ////////////////////////////////////////////////////////////////////////////////// // get_cl_median method1: iterate over only the non-zero elements in a column in a sparse matrix ////////////////////////////////////////////////////////////////////////////////// //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_medians(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - // call R function to find positions of each cell in matrix +Rcpp::NumericMatrix rcpp_get_cl_medians(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); - IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name);//cl_pos is the position number of cl_all_cl_name in the count matrix - + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); //cl_pos is the position number of cl_all_cl_name in the count matrix + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } /* Set up hash map: cluster_col_pos_map is the map for vector of position in each cluster*/ std::unordered_map> cluster_col_pos_map; - for(int i = 0; i < cl.size(); i++) { - - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + + if (cl[i] < 1) continue; - - cluster_col_pos_map[cl[i]].push_back(i); + cluster_col_pos_map[cl[i]].push_back(i); } - - + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster the column number in res matrix levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -867,175 +854,174 @@ Rcpp::NumericMatrix rcpp_get_cl_medians(Rcpp::RObject mat, Rcpp::IntegerVector c std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - + } + /* Loop through cluster_col_pos_map and create vector of vector*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), cluster_col_pos_map.size()); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - - + std::vector workspace_i(ptr->get_nrow()); - - - for(auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) { + for (auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) + { auto cluster_id = it->first; auto pos_vec = it->second; - - + std::vector> sub_mat(ptr->get_nrow()); - for (auto pos_i : pos_vec) { + for (auto pos_i : pos_vec) + { // loop over col_i-th column of sub mat matrix auto indices = ptr->get_col(pos_i, workspace_x.data(), workspace_i.data()); - auto xptr = indices.x; - auto iptr = indices.i; + auto xptr = indices.x; + auto iptr = indices.i; auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - sub_mat[*(iptr+row_i)].push_back(*(xptr+row_i)); + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + sub_mat[*(iptr + row_i)].push_back(*(xptr + row_i)); } } - + size_t n = pos_vec.size() / 2; - - for(int i=0; i> sub_mat; - - std::vector mat_cluster_vector; - - std::vector pos_vec; - - size_t n; - // destination matrix - RMatrix output; - - // initialize with source, cl_id and destination - ColumnMedianSparse(std::vector> sub_mat, - std::vector mat_cluster_vector, - std::vector pos_vec, - size_t n, - NumericMatrix output) - : sub_mat(sub_mat), mat_cluster_vector(mat_cluster_vector), pos_vec(pos_vec), n(n), output(output) {} - - // get the column sum of the given cols - - void operator()(std::size_t begin, std::size_t end) { - - - for(int i = begin; i < end; i++){ + // source matrix and maps + std::vector> sub_mat; + + std::vector mat_cluster_vector; + + std::vector pos_vec; + + size_t n; + // destination matrix + RMatrix output; + + // initialize with source, cl_id and destination + ColumnMedianSparse(std::vector> sub_mat, + std::vector mat_cluster_vector, + std::vector pos_vec, + size_t n, + NumericMatrix output) + : sub_mat(sub_mat), mat_cluster_vector(mat_cluster_vector), pos_vec(pos_vec), n(n), output(output) {} + + // get the column sum of the given cols + + void operator()(std::size_t begin, std::size_t end) + { + + for (int i = begin; i < end; i++) + { sub_mat[i].resize(pos_vec.size(), 0); - - std::nth_element(sub_mat[i].begin(), sub_mat[i].begin()+n, sub_mat[i].end()); - double vn = sub_mat[i][n]; - - if(pos_vec.size() % 2 == 1){ - - output(i, mat_cluster_vector[pos_vec[0]]) = vn; - }else{ - - std::nth_element(sub_mat[i].begin(), sub_mat[i].begin()+n-1, sub_mat[i].end()); - output(i, mat_cluster_vector[pos_vec[0]]) = 0.5*(vn+sub_mat[i][n-1]); - + + std::nth_element(sub_mat[i].begin(), sub_mat[i].begin() + n, sub_mat[i].end()); + double vn = sub_mat[i][n]; + + if (pos_vec.size() % 2 == 1) + { + + output(i, mat_cluster_vector[pos_vec[0]]) = vn; + } + else + { + + std::nth_element(sub_mat[i].begin(), sub_mat[i].begin() + n - 1, sub_mat[i].end()); + output(i, mat_cluster_vector[pos_vec[0]]) = 0.5 * (vn + sub_mat[i][n - 1]); } - } - } - - - + } }; - - //[[Rcpp::export]] -Rcpp::NumericMatrix rcpp_get_cl_medians_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll){ - // call R function to find positions of each cell in matrix +Rcpp::NumericMatrix rcpp_get_cl_medians_RcppParallel(Rcpp::RObject mat, Rcpp::IntegerVector clAll) +{ + // call R function to find positions of each cell in matrix Function colnames_f("colnames"); CharacterVector mat_name = colnames_f(mat); - + Function names_f("names"); CharacterVector cl_all_cl_name = names_f(clAll); - + Function match_f("match"); - IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name);//cl_pos is the position number of cl_all_cl_name in the count matrix - + IntegerVector cl_pos = match_f(cl_all_cl_name, mat_name); //cl_pos is the position number of cl_all_cl_name in the count matrix + CharacterVector levs_all = clAll.attr("levels"); std::unordered_map cluster_col_name_id_map; std::unordered_map cluster_col_name_lev_map; - - for(int i = 0; i < clAll.length(); i++) { + + for (int i = 0; i < clAll.length(); i++) + { cluster_col_name_id_map[std::string(cl_all_cl_name[i])] = clAll[i]; cluster_col_name_lev_map[std::string(cl_all_cl_name[i])] = std::string(levs_all[clAll[i] - 1]); } std::vector cl(mat_name.length(), 0); CharacterVector cl_colnames_vec(mat_name.length()); - for(int i = 0; i < cl_pos.length(); i++) { - cl[cl_pos[i]-1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i]-1])]; - cl_colnames_vec[cl_pos[i]-1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i]-1])]; + for (int i = 0; i < cl_pos.length(); i++) + { + cl[cl_pos[i] - 1] = cluster_col_name_id_map[std::string(mat_name[cl_pos[i] - 1])]; + cl_colnames_vec[cl_pos[i] - 1] = cluster_col_name_lev_map[std::string(mat_name[cl_pos[i] - 1])]; } /* Set up hash map: cluster_col_pos_map is the map for vector of position in each cluster*/ std::unordered_map> cluster_col_pos_map; - for(int i = 0; i < cl.size(); i++) { - - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + + if (cl[i] < 1) continue; - - cluster_col_pos_map[cl[i]].push_back(i); + cluster_col_pos_map[cl[i]].push_back(i); } - - + /* Set up hash maps for column cluster lookup: mat_cluster_vector is the column number in the res matrix for whole dataset, cluster_col_map is for each cluster the column number in res matrix levs is the level of the cluster id: "1" "2" "3" "4" "5" "6" "7" "8" "9" "23" @@ -1045,61 +1031,63 @@ Rcpp::NumericMatrix rcpp_get_cl_medians_RcppParallel(Rcpp::RObject mat, Rcpp::In std::unordered_map cluster_col_map; int col_id = 0; CharacterVector colnames_vec; - for(int i = 0; i < cl.size(); i++){ - if (cl[i] < 1) + for (int i = 0; i < cl.size(); i++) + { + if (cl[i] < 1) continue; - if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) { + if (cluster_col_map.find(cl[i]) == cluster_col_map.end()) + { cluster_col_map[cl[i]] = col_id; mat_cluster_vector[i] = col_id; col_id++; colnames_vec.push_back(cl_colnames_vec[i]); - } else { + } + else + { mat_cluster_vector[i] = cluster_col_map[cl[i]]; } - } - + } + /* Loop through cluster_col_pos_map and create vector of vector*/ auto ptr = beachmat::read_lin_sparse_block(mat); NumericMatrix res(ptr->get_nrow(), cluster_col_pos_map.size()); std::vector workspace_x(ptr->get_nrow()); - std::vector workspace_i(ptr->get_nrow()); - - - - for(auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) { + std::vector workspace_i(ptr->get_nrow()); + + for (auto it = cluster_col_pos_map.begin(); it != cluster_col_pos_map.end(); ++it) + { auto cluster_id = it->first; auto pos_vec = it->second; - - + std::vector> sub_mat(ptr->get_nrow()); - for (auto pos_i : pos_vec) { + for (auto pos_i : pos_vec) + { // loop over col_i-th column of sub mat matrix auto indices = ptr->get_col(pos_i, workspace_x.data(), workspace_i.data()); auto xptr = indices.x; // row values auto iptr = indices.i; // row indices auto nnzero = indices.n; - - for (int row_i = 0; row_i < nnzero; row_i++){ - - sub_mat[*(iptr+row_i)].push_back(*(xptr+row_i)); + + for (int row_i = 0; row_i < nnzero; row_i++) + { + + sub_mat[*(iptr + row_i)].push_back(*(xptr + row_i)); } } - + size_t n = pos_vec.size() / 2; - + // column mean sparse functor (pass input and output matrixes) - - ColumnMedianSparse column_median_sparse(sub_mat, mat_cluster_vector, pos_vec, n, res); - - // call parallelFor to do the work - parallelFor(0, sub_mat.size(), column_median_sparse); - - + + ColumnMedianSparse column_median_sparse(sub_mat, mat_cluster_vector, pos_vec, n, res); + + // call parallelFor to do the work + parallelFor(0, sub_mat.size(), column_median_sparse); } colnames(res) = colnames_vec; // call R function to read and assign rownames Function rownames_f("rownames"); rownames(res) = rownames_f(mat); - return res; + return res; } From 2c118b587a45e5499180537a88002a4773dfc634 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 23 Jun 2021 14:21:31 -0700 Subject: [PATCH 62/70] Modify plot_3d functions --- R/reduceDimension_plot.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 1345ec0..128f011 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -619,7 +619,7 @@ plot_2d_umap_anno <- function(umap.fn, #for(umap.fn in dir(dest.d, pattern="umap.2d.sampled.csv")){ # plot_2d_umap(umap.fn, dest.d) #} -plot_3d_umap_anno <- function(umap.fn, dest.d, anno.df, cols= c("region_color","cluster_color"), label_cols=list(NULL, "cluster_label"), win.dim=c(20,40,1500, 800), cex=0.7, html.fn = NULL) +plot_3d_umap_anno <- function(umap.fn,anno.df, cols= c("region","cluster"), label_cols=list(NULL, "cluster_label"), win.dim=c(20,40,1500, 800), cex=0.7, html.fn = NULL,dest.d="./") { umap.3d <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) colnames(umap.3d) = c("sample_name", paste0("Dim", 1:(ncol(umap.3d)-1))) From 06e2e92d1781cc3343b4a3c25da3292ff6830b7f Mon Sep 17 00:00:00 2001 From: yzizhen <34460659+yzizhen@users.noreply.github.com> Date: Wed, 23 Jun 2021 14:35:23 -0700 Subject: [PATCH 63/70] Update reduceDimension_plot.R --- R/reduceDimension_plot.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 128f011..bbef310 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -622,7 +622,7 @@ plot_2d_umap_anno <- function(umap.fn, plot_3d_umap_anno <- function(umap.fn,anno.df, cols= c("region","cluster"), label_cols=list(NULL, "cluster_label"), win.dim=c(20,40,1500, 800), cex=0.7, html.fn = NULL,dest.d="./") { umap.3d <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) - colnames(umap.3d) = c("sample_name", paste0("Dim", 1:(ncol(umap.3d)-1))) + colnames(umap.3d) = c("sample_id", paste0("Dim", 1:(ncol(umap.3d)-1))) umap.3d <- umap.3d %>% left_join(anno.df) plot_3d_label_multiple(umap.3d, cols=cols, label_cols=label_cols, cex=cex, win.dim=win.dim, fn = html.fn, dir=dest.d) } From 61b10ce94238e08467fd88a9b2d4cb1ed920a043 Mon Sep 17 00:00:00 2001 From: cvanvelt Date: Wed, 23 Jun 2021 17:33:53 -0700 Subject: [PATCH 64/70] Update 3d rglwidget plotting --- R/reduceDimension_plot.R | 150 +++++++++++++++++++++++++++++---------- 1 file changed, 111 insertions(+), 39 deletions(-) diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index bbef310..99d35f7 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -1,6 +1,8 @@ jet.colors <-colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan","#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000")) +blue.red <-colorRampPalette(c("blue", "white", "red")) -#' Title + +#' get_RD_cl_center #' #' @param rd.dat #' @param cl @@ -20,7 +22,7 @@ get_RD_cl_center <- function(rd.dat, cl) })) } -#' Title +#' plot_RD_cl #' #' @param rd.dat #' @param cl @@ -96,7 +98,7 @@ plot_RD_cl <- function(rd.dat, cl, cl.color, cl.label,cex=0.15, fn.size =2, alph ###meta is discretized. -#' Title +#' plot_RD_meta #' #' @param rd.dat #' @param meta @@ -146,7 +148,7 @@ plot_RD_meta <- function(rd.dat, meta, meta.col=NULL,show.legend=TRUE, cex=0.15, } -#' Title +#' plot_RD_gene #' #' @param rd.dat #' @param norm.dat @@ -191,34 +193,36 @@ plot_RD_gene <- function(rd.dat, norm.dat, genes, cex=0.15) #' @examples multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { library(grid) - # Make a list from the ... arguments and plotlist + # Make a list from the ... arguments and plotlist plots <- c(list(...), plotlist) numPlots = length(plots) - # If layout is NULL, then use 'cols' to determine layout + # If layout is NULL, then use 'cols' to determine layout if (is.null(layout)) { - # Make the panel - # ncol: Number of columns of plots - # nrow: Number of rows needed, calculated from # of cols - layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), - ncol = cols, nrow = ceiling(numPlots/cols)) + # Make the panel + # ncol: Number of columns of plots + # nrow: Number of rows needed, calculated from # of cols + layout <- matrix(seq(1, cols * ceiling(numPlots/cols)), + ncol = cols, + nrow = ceiling(numPlots/cols)) } if (numPlots==1) { print(plots[[1]]) } else { - # Set up the page - grid.newpage() - pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) - - # Make each plot, in the correct location + # Set up the page + grid.newpage() + pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout)))) + + # Make each plot, in the correct location for (i in 1:numPlots) { - # Get the i,j matrix positions of the regions that contain this subplot + # Get the i,j matrix positions of the regions that contain this subplot matchidx <- as.data.frame(which(layout == i, arr.ind = TRUE)) - print(plots[[i]], vp = viewport(layout.pos.row = matchidx$row, + print(plots[[i]], + vp = viewport(layout.pos.row = matchidx$row, layout.pos.col = matchidx$col)) } } @@ -226,7 +230,7 @@ multiplot <- function(..., plotlist=NULL, file, cols=1, layout=NULL) { -#' Title +#' plot_3d_label #' #' @param df #' @param col @@ -268,7 +272,7 @@ plot_3d_label <- function(df, col, label_col=NULL,cex=1, label.cex=cex, init=TRU } } -#' Title +#' mybgplot3d #' #' @param tt #' @param bg.col @@ -297,7 +301,7 @@ mybgplot3d <- function(tt, bg.col=bg.col) } -#' Title +#' plot_3d_val #' #' @param df #' @param val @@ -329,7 +333,7 @@ plot_3d_val <- function(df, val, cex=1, max.val=quantile(val, 0.99), init=TRUE, -#' Title +#' plot_3d_label_multiple #' #' @param df #' @param cols @@ -346,23 +350,35 @@ plot_3d_val <- function(df, val, cex=1, max.val=quantile(val, 0.99), init=TRUE, #' @export #' #' @examples -plot_3d_label_multiple <- function(df, cols, label_cols, cex=0.7, label.cex=0.7, fn = NULL,win.dim = c(20,40,1200,800), layout = NULL, bg.col="gray60", dir="./") + +plot_3d_label_multiple <- function(df, + cols, + label_cols, + cex=0.7, + label.cex=0.7, + fn = NULL, + win.dim = c(20,40,1200,800), + layout = NULL, + bg.col="gray60", + dir="./") { n.win = length(cols) library(rgl) - mfrow3d(1,n.win) - next3d() + options(rgl.printRglwidget = TRUE) - open3d() + rgl::mfrow3d(1,n.win) + rgl::next3d() + + rgl::open3d() ###specify dimensions of the plots - par3d(windowRect=win.dim) + rgl::par3d(windowRect=win.dim) #bg3d(bg.col) if(is.null(layout)){ layout <- matrix(1:n.win, nrow=1) layout = rbind(layout, layout) } - layout3d(layout, sharedMouse = TRUE) + rgl::layout3d(layout, sharedMouse = TRUE) for (i in 1:n.win) { next3d() @@ -370,18 +386,39 @@ plot_3d_label_multiple <- function(df, cols, label_cols, cex=0.7, label.cex=0.7, if(length(col)==1){ tmp.col = paste0(col,"_color") if(tmp.col %in% colnames(df)){ - plot_3d_label(df, col=tmp.col, label_col=label_cols[[i]],init=FALSE, cex=cex, label.cex=label.cex, prefix=names(cols)[i], bg.col=bg.col) + print(1) + plot_3d_label(df, + col=tmp.col, + label_col=label_cols[[i]], + init=FALSE, + cex=cex, + label.cex=label.cex, + prefix=names(cols)[i], + bg.col=bg.col) } else{ - plot_3d_val(df, val=df[[col]], init=FALSE,cex=cex,prefix=names(cols)[i], bg.col=bg.col) + print(2) + plot_3d_val(df, + val=df[[col]], + init=FALSE, + cex=cex, + prefix=names(cols)[i], + bg.col=bg.col) } } else{ - plot_3d_val(df, val=col,init=FALSE, cex=cex,prefix=names(cols)[i],bg.col=bg.col) + print(3) + plot_3d_val(df, + val=col, + init=FALSE, + cex=cex, + prefix=names(cols)[i], + bg.col=bg.col) } } if(!is.null(fn)){ - writeWebGL(dir=dir, filename=fn) + filename=file.path(dir, paste0(fn, ".html")) + htmlwidgets::saveWidget(rglwidget(), filename) } } @@ -615,15 +652,50 @@ plot_2d_umap_anno <- function(umap.fn, +#' plot_3d_umap_anno +#' +#' @param umap.fn path to umap coordinates. CSV file containing sample_names and umap x/y/z coordinates +#' @param anno.df Sample annotations. The first column should be sample_id, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. +#' @param dest.d path to load data from and save plots to. +#' @param cols base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. +#' @param label_cols Which label on top of plot. +#' @param win.dim dimensions of plot window +#' @param cex size of plotted points. Default = 0.25 +#' @param html.fn name of html file to save figures can be saved as "png", "pdf" or "both" +#' +#' @example_data: +#' +#' umap <- read.csv("data/rd_plot_example/3d.umap.sampled.csv") +#' load("data/rd_plot_example/anno.df.3d.rda") +#' +#' +#' @usage plots <- plot_3d_umap_anno(umap.fn="3d.umap.sampled.csv", anno.df, cols=c("platform","cluster"),label_cols=list(NULL,NULL),html.fn = "3d.umap",dest.d="data/rd_plot_example" ) +#' +#' +#' + #dest.d = "Manuscript/common/umap_constellation/" #for(umap.fn in dir(dest.d, pattern="umap.2d.sampled.csv")){ # plot_2d_umap(umap.fn, dest.d) #} -plot_3d_umap_anno <- function(umap.fn,anno.df, cols= c("region","cluster"), label_cols=list(NULL, "cluster_label"), win.dim=c(20,40,1500, 800), cex=0.7, html.fn = NULL,dest.d="./") - { - umap.3d <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) - colnames(umap.3d) = c("sample_id", paste0("Dim", 1:(ncol(umap.3d)-1))) - umap.3d <- umap.3d %>% left_join(anno.df) - plot_3d_label_multiple(umap.3d, cols=cols, label_cols=label_cols, cex=cex, win.dim=win.dim, fn = html.fn, dir=dest.d) - } +plot_3d_umap_anno <- function(umap.fn, + anno.df, + cols= c("region","cluster"), + label_cols=list(NULL,"cluster_label"), + win.dim=c(20,40,1500, 800), + cex=0.7, + html.fn = NULL, + dest.d="./") +{ + umap.3d <- as.data.frame(fread(file.path(dest.d,umap.fn),header=TRUE)) + colnames(umap.3d) = c("sample_id", paste0("Dim", 1:(ncol(umap.3d)-1))) + umap.3d <- umap.3d %>% left_join(anno.df) + plot_3d_label_multiple(umap.3d, + cols=cols, + label_cols=label_cols, + cex=cex, + win.dim=win.dim, + fn = html.fn, + dir=dest.d) +} From da31bf61e696e3b0ca3316373df57afc79117101 Mon Sep 17 00:00:00 2001 From: Yuan Gao Date: Fri, 2 Jul 2021 18:30:17 -0700 Subject: [PATCH 65/70] Fix bug in rcpp_get_sqr_means --- src/Rcpp_parallel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Rcpp_parallel.cpp b/src/Rcpp_parallel.cpp index 497e723..738bc7d 100644 --- a/src/Rcpp_parallel.cpp +++ b/src/Rcpp_parallel.cpp @@ -636,7 +636,7 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means(Rcpp::RObject mat, Rcpp::IntegerVector for (int row_i = 0; row_i < nnzero; row_i++) { - res(*(iptr + row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr + row_i)); + res(*(iptr + row_i), mat_cluster_vector[col_i]) += std::pow(*(xptr + row_i),2.0); } } @@ -695,7 +695,7 @@ struct ColumnSqrMeansSparse : public Worker for (int row_i = 0; row_i < nnzero; row_i++) { - output(*(iptr + row_i), mat_cluster_vector[col_i]) += std::sqrt(*(xptr + row_i)); + output(*(iptr + row_i), mat_cluster_vector[col_i]) += std::pow(*(xptr + row_i), 2.0); } } } @@ -784,7 +784,7 @@ Rcpp::NumericMatrix rcpp_get_cl_sqr_means_RcppParallel(Rcpp::RObject mat, Rcpp:: ColumnSqrMeansSparse column_sqr_means_sparse(matrix_ptr, mat_cluster_vector, cl, res); // call parallelFor to do the work - parallelFor(0, ptr->get_ncol(), column_sqr_means_sparse, 20); + parallelFor(0, ptr->get_ncol(), column_sqr_means_sparse); // loop over columns of res matrix, and divide by number of cells in each cluster for (int i = 0; i < res.ncol(); i++) From 995e39bfce9681ec12637e1d5e8de5fe99881840 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 13 Jul 2021 11:37:30 -0700 Subject: [PATCH 66/70] Bug fix with merge_cl --- R/annotate.R | 35 +++++++------- R/find_noise_cl.R | 22 +++++---- R/markers.R | 11 +---- R/merge_cl.R | 99 ++++++++++++++++------------------------ R/reduceDimension_plot.R | 12 ++--- 5 files changed, 78 insertions(+), 101 deletions(-) diff --git a/R/annotate.R b/R/annotate.R index 6262dd5..97d65b1 100644 --- a/R/annotate.R +++ b/R/annotate.R @@ -47,27 +47,30 @@ map_by_cor <- function(train.dat, train.cl, test.dat, + cl.dat = NULL, method = "median") { method <- match.arg(arg = method, choices = c("mean","median")) - - # Get medians or means for each cluster - if(method == "median"){ - cl.meds <- tapply(names(train.cl), - train.cl, - function(x) { - train.mat <- train.dat[, x, drop = F] - train.mat <- as.matrix(train.mat) - matrixStats::rowMedians(train.mat) - } - ) - - cl.dat <- do.call("cbind", cl.meds) - } else { - cl.dat <- get_cl_means(train.dat, train.cl) + + if(is.null(cl.dat)){ + # Get medians or means for each cluster + if(method == "median"){ + cl.meds <- tapply(names(train.cl), + train.cl, + function(x) { + train.mat <- train.dat[, x, drop = F] + train.mat <- as.matrix(train.mat) + matrixStats::rowMedians(train.mat) + } + ) + + cl.dat <- do.call("cbind", cl.meds) + } else { + cl.dat <- get_cl_means(train.dat, train.cl) + } + row.names(cl.dat) <- row.names(train.dat) } - row.names(cl.dat) <- row.names(train.dat) # Perform correlations if(!is.matrix(test.dat) & nrow(test.dat)*ncol(test.dat) > 1e8){ diff --git a/R/find_noise_cl.R b/R/find_noise_cl.R index cf9764a..c39ece1 100644 --- a/R/find_noise_cl.R +++ b/R/find_noise_cl.R @@ -107,16 +107,16 @@ find_doublet <- function(cl.df, cl.sim, cl.good, de.genes=NULL) cl1= row.names(nn.df)[i] cl2=as.character(nn.df$nn.cl[i]) de = get_de_pair(de.genes, cl1, cl2) - up.genes = head(de$names(up.genes), 50) + up.genes = head(names(de$up.genes), 50) nn.df$up.genes[i] = length(up.genes) - nn.df$up.genes.score[i] = sum(-log10(de$up.genes[up.genes])) + nn.df$up.genes.score[i] = sum(pmin(-log10(de$up.genes[up.genes]),20)) up.genes.olap =sapply( setdiff(cl.good, c(cl1,cl2)), function(k){ p = paste0(k,"_",cl2) tmp.de = get_de_pair(de.genes, k, cl2) olap.genes= intersect(names(tmp.de$up.genes), up.genes) olap.num = length(olap.genes) - olap.score= sum(-log10(de$up.genes[olap.genes])) + olap.score= sum(pmin(-log10(de$up.genes[olap.genes]), 20)) c(olap.num, olap.score) }) cl3 = names(which.max(up.genes.olap[1,])) @@ -127,11 +127,11 @@ find_doublet <- function(cl.df, cl.sim, cl.good, de.genes=NULL) de1 = get_de_pair(de.genes, cl1, cl3) up.genes = head(names(de1$up.genes), 50) - up.gene.score= sum(-log10(de1$up.genes[up.genes])) + up.gene.score= sum(pmin(-log10(de1$up.genes[up.genes]),20)) de2 = get_de_pair(de.genes, cl2, cl3) olap.genes = intersect(names(de2$up.genes), up.genes) nn.df$max.olap.genes2[i] = length(olap.genes) - nn.df$max.olap.score2[i] = sum(-log10(de1$up.genes[olap.genes])) + nn.df$max.olap.score2[i] = sum(pmin(-log10(de1$up.genes[olap.genes]),20)) nn.df$max.olap.ratio2[i] = nn.df$max.olap.score2[i]/ up.gene.score } nn.df$max.olap.cl_label = cl.df[as.character(nn.df$max.olap.cl),"cluster_label"] @@ -283,13 +283,16 @@ plot_low_qc <- function(norm.dat, -find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) +find_doublet_all <- function(de.genes, mc.cores=5, min.genes=100) { require(parallel) if(is.null(de.genes)){ stop("Need to specify de.genes") } - result.list= parallel::pvec(names(de.genes), function(pairs){ + pairs.df = get_pairs(names(de.genes)) + + cl = union(pairs.df[,1],pairs.df[,2]) + result.list= parallel::pvec(sample(row.names(pairs.df)), function(pairs){ result.list= sapply(pairs, function(p){ de = de.genes[[p]] if(length(de)==0){ @@ -298,9 +301,8 @@ find_doublet_all <- function(de.genes, cl, mc.cores=5, min.genes=100) if(de$up.num < min.genes | de$down.num < min.genes){ return(NULL) } - tmp=strsplit(p,"_")[[1]] - cl1 = tmp[[1]] - cl2 = tmp[[2]] + cl1 = pairs.df[p,1] + cl2 = pairs.df[p,2] up.genes.score = head(de$up.genes, 50) down.genes.score = head(de$down.genes,50) diff --git a/R/markers.R b/R/markers.R index 4a29ba6..8bd2f47 100644 --- a/R/markers.R +++ b/R/markers.R @@ -10,9 +10,7 @@ #' @export #' #' @examples - - -select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1,bin.lfc.th=NULL,...) +select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1,...) { require(parallel) if(is.null(de.genes)){ @@ -25,13 +23,6 @@ select_markers <- function(norm.dat, cl, n.markers=20,de.genes=NULL, mc.cores=1, sapply(s, function(x){ tmp = de.genes[[x]] select.genes = c(head(names(tmp$up.genes),n.markers), head(names(tmp$down.genes),n.markers)) - ###Choose binary genes even if not the top genes - if(!is.null(bin.lfc.th)){ - de.df = tmp$de.df - bin.genes = tmp$genes[abs(de.df[tmp$genes, "lfc"]) > bin.lfc.th] - select.genes = union(select.genes, bin.genes) - } - select.genes },simplify=F) },mc.cores=mc.cores) if(!is.null(norm.dat)){ diff --git a/R/merge_cl.R b/R/merge_cl.R index 8bde21d..e9f2aef 100644 --- a/R/merge_cl.R +++ b/R/merge_cl.R @@ -35,6 +35,26 @@ test_merge <- function(de.pair, de.param, merge.type="undirectional") } +get_knn_pairs <- function(cl.rd, cl.rd.ref=cl.rd, k=5, method="Annoy.Euclidean") + { + knn.result= get_knn(cl.rd, cl.rd.ref, k=min(k, ncol(cl.rd)),method=method, return.distance=TRUE) + knn.matrix = knn.result[[1]] + knn.dist = knn.result[[2]] + merge.pairs = data.frame(c1= rep(colnames(cl.rd),ncol(knn.matrix)), c2= colnames(cl.rd.ref)[as.vector(knn.matrix)]) + merge.pairs$dist = as.vector(knn.dist) + merge.pairs$sim = 1 - merge.pairs$dist/max(merge.pairs$dist) + merge.pairs = merge.pairs[merge.pairs[,1]!=merge.pairs[,2],] + merge.pairs[,1] = as.integer(merge.pairs[,1]) + merge.pairs[,2] = as.integer(merge.pairs[,2]) + tmp1 =pmin(merge.pairs[,1],merge.pairs[,2]) + tmp2 =pmax(merge.pairs[,1],merge.pairs[,2]) + merge.pairs[,1:2] = cbind(tmp1,tmp2) + p = paste(merge.pairs[,1],merge.pairs[,2],sep="_") + merge.pairs= merge.pairs[!duplicated(p),,drop=F] + row.names(merge.pairs) = p[!duplicated(p)] + merge.pairs = merge.pairs[order(merge.pairs$sim,decreasing=T),] + } + #' Merge clusters based on pairwise differential expressed genes. #' #' @param norm.dat normalized expression data matrix in log transform, using genes as rows, and cells and columns. Users can use log2(FPKM+1) or log2(CPM+1) @@ -46,7 +66,6 @@ test_merge <- function(de.pair, de.param, merge.type="undirectional") #' @param de.method Use limma by default. We are still testing "chisq" mode. #' @param de.genes If not null, use DE genes computated prevoiusly by DE_genes_pw or DE_genes_pairs to avoid recomputing. #' @param return.markers If TRUE, compute the DE genes between very pairs of clusters as markers -#' @param pairBatch The number of pairs to be tested for merging in one batch. Avoid compairing many pairs at the same time to reduce memory comsumption. Default 40 #' @param sampled For big dataset, norm.dat may not include all cells from cl. If TRUE, norm.dat is the data matrix for downsampled cells, and no need for further down sampling. #' #' @return A list with cl (cluster membership), de.genes (differentially expressed genes), sc (cluster pairwise de.score), markers (top cluster pairwise markers) @@ -63,8 +82,8 @@ merge_cl<- function(norm.dat, de.method = "fast_limma", de.genes = NULL, return.markers = FALSE, - pairBatch =40, - verbose = 0) + verbose = 0, + k=4) { if(!is.integer(cl)){ cl = setNames(as.integer(as.character(cl)), names(cl)) @@ -90,24 +109,16 @@ merge_cl<- function(norm.dat, break } cl.small = names(cl.size)[cl.size < de.param$min.cells] + ###if all clusters are small, not need for further split. + if(length(cl.small)==length(cl.size)){ + return(NULL) + } if(length(cl.small)==0){ break - } - ##Compute cluster similary on reduced dimension - if(ncol(cl.rd)>2 & nrow(cl.rd) > 2){ - cl.sim = cor(as.matrix(cl.rd)) - } - else{ - cl.diff=as.matrix(dist(t(as.matrix(cl.rd)))) - cl.sim = 1 - cl.diff/max(cl.diff) - } - tmp=as.data.frame(as.table(cl.sim[cl.small,,drop=F])) - tmp[,1]=as.integer(as.character(tmp[,1])) - tmp[,2]=as.integer(as.character(tmp[,2])) - tmp = tmp[tmp[,1]!=tmp[,2],,drop=F] - closest.pair = which.max(tmp$Freq) - x = tmp[closest.pair,1] - y= tmp[closest.pair,2] + } + merge.pairs = get_knn_pairs(cl.rd[,!colnames(cl.rd) %in% cl.small, drop=F], cl.rd[,cl.small,drop=F], k=1) + x = merge.pairs[1,1] + y= merge.pairs[1,2] if(verbose > 0){ cat("Merge: ", x,y, "sim:", tmp[closest.pair,3],"\n") } @@ -124,42 +135,13 @@ merge_cl<- function(norm.dat, cl.sqr.means = as.data.frame(get_cl_sqr_means(norm.dat,tmp.cl)) while(length(unique(cl)) > 1){ - if(length(unique(cl)) == 2){ - merge.pairs = as.data.frame(matrix(as.integer(colnames(cl.rd)), nrow=1)) - merge.pairs$sim = cor(cl.rd[,1], cl.rd[,2]) - row.names(merge.pairs) = paste(merge.pairs[,1], merge.pairs[,2],sep="_") - } - else{ - ##Compute cluster similary on reduced dimension - if(ncol(cl.rd)>2 & nrow(cl.rd) > 2){ - cl.sim = cor(cl.rd) - } - else{ - cl.diff=as.matrix(dist(t(cl.rd))) - cl.sim = 1 - cl.diff/max(cl.diff) - } - - knn.matrix= sim_knn(cl.sim, k=pmin(4, ncol(cl.sim))) - merge.pairs = do.call("rbind",apply(knn.matrix, 2,function(x)data.frame(c1=row.names(knn.matrix),c2=colnames(cl.sim)[x] , stringsAsFactors=FALSE))) - merge.pairs = merge.pairs[merge.pairs[,1]!=merge.pairs[,2],] - merge.pairs$sim = get_pair_matrix(cl.sim, merge.pairs[,1], merge.pairs[,2]) - merge.pairs[,1] = as.integer(merge.pairs[,1]) - merge.pairs[,2] = as.integer(merge.pairs[,2]) - tmp1 =pmin(merge.pairs[,1],merge.pairs[,2]) - tmp2 =pmax(merge.pairs[,1],merge.pairs[,2]) - merge.pairs[,1:2] = cbind(tmp1,tmp2) - p = paste(merge.pairs[,1],merge.pairs[,2],sep="_") - merge.pairs= merge.pairs[!duplicated(p),,drop=F] - row.names(merge.pairs) = p[!duplicated(p)] - merge.pairs = merge.pairs[order(merge.pairs$sim,decreasing=T),] - } - - ###Determine the de score for these pairs + merge.pairs = get_knn_pairs(cl.rd, cl.rd, k=k) +###Determine the de score for these pairs if(nrow(merge.pairs)==0){ - break - } + break + } - #####get DE genes for new pairs +#####get DE genes for new pairs new.pairs = setdiff(row.names(merge.pairs),names(de.genes)) if(verbose > 0){ cat("Compute DE genes\n") @@ -184,16 +166,15 @@ merge_cl<- function(norm.dat, sc = sc[to.merge] to.merge= merge.pairs[names(sc),,drop=FALSE] to.merge$sc = sc - - + merged =c() - ###The first pair in to.merge always merge. For the remaining pairs, if both clusters have already enough cells, - ###or independent of previus merging, then they can be directly merged as well, without re-assessing DE genes. +###The first pair in to.merge always merge. For the remaining pairs, if both clusters have already enough cells, +###or independent of previus merging, then they can be directly merged as well, without re-assessing DE genes. for(i in 1:nrow(to.merge)){ p = c(to.merge[i,1], to.merge[i,2]) if(i == 1 | sc[i] < de.param$de.score.th /2 & length(intersect(p, merged))==0){ cl[cl==p[2]] = p[1] - + p = as.character(p) if(verbose > 0){ cat("Merge ",p[1], p[2], to.merge[i,"sc"], to.merge[i, "sim"], cl.size[p[1]],"cells", cl.size[p[2]],"cells", "\n") @@ -214,7 +195,7 @@ merge_cl<- function(norm.dat, merged = c(merged,p) } } - } + } if(length(unique(cl))<2){ return(NULL) } diff --git a/R/reduceDimension_plot.R b/R/reduceDimension_plot.R index 99d35f7..44846a8 100644 --- a/R/reduceDimension_plot.R +++ b/R/reduceDimension_plot.R @@ -517,8 +517,8 @@ plot_RD_cl_subset<- function(rd.dat, cl, cl.color,cl.label,select.samples,missin #' plot_2d_umap_anno #' -#' @param umap.fn path to umap coordinates. CSV file containing sample_names and umap x/y coordinates -#' @param anno.df Sample annotations. The first column should be sample_name, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. +#' @param umap.fn path to umap coordinates. CSV file containing sample_id and umap x/y coordinates +#' @param anno.df Sample annotations. The first column should be sample_id, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. #' @param dest.d path to save plots. #' @param meta.fields base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. #' @param show.label TRUE or FALSE. To show cluster label on top of plot. @@ -559,11 +559,11 @@ plot_2d_umap_anno <- function(umap.fn, if(is.null(umap.2d)){ #load umap from csv umap.2d <- as.data.frame(fread(umap.fn,header=TRUE)) - colnames(umap.2d) <- c("sample_name","Dim1","Dim2") + colnames(umap.2d) <- c("sample_id","Dim1","Dim2") umap.2d <- umap.2d[sample(1:nrow(umap.2d)),] } umap.df = umap.2d %>% left_join(anno.df) - row.names(umap.2d)<-umap.2d$sample_name + row.names(umap.2d)<-umap.2d$sample_id umap.2d <- umap.2d[,c("Dim1","Dim2")] # extract filename for saving @@ -571,7 +571,7 @@ plot_2d_umap_anno <- function(umap.fn, umap.fn <- gsub(".csv", "",umap.fn) #setup cluster labels/colors for plotting - cl <- setNames(umap.df$cl, umap.df$sample_name) + cl <- setNames(umap.df$cl, umap.df$sample_id) cl.df <- umap.df %>% select(cluster_id, cluster_label, cluster_color,cl) %>% unique cl.color <- setNames(cl.df$cluster_color, cl.df$cl) cl.label <- setNames(cl.df$cluster_label, cl.df$cl) @@ -654,7 +654,7 @@ plot_2d_umap_anno <- function(umap.fn, #' plot_3d_umap_anno #' -#' @param umap.fn path to umap coordinates. CSV file containing sample_names and umap x/y/z coordinates +#' @param umap.fn path to umap coordinates. CSV file containing sample_id and umap x/y/z coordinates #' @param anno.df Sample annotations. The first column should be sample_id, and each annotation should have \_id, \_label, and \_color columns. Requires cluster_id which needs to be sequential in order of the dendrogram. #' @param dest.d path to load data from and save plots to. #' @param cols base name of variables to be represented as bargraphs below dendrogram. Annotation variables need to be represented as \_id, \_label, \_color in anno. From e817f80826ec15912272bd2de6dbc14909e84240 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Tue, 13 Jul 2021 14:35:21 -0700 Subject: [PATCH 67/70] Bug fix with harmonize function --- R/harmonize.R | 6 +++--- R/harmonize_merge.R | 3 ++- R/util.R | 49 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/R/harmonize.R b/R/harmonize.R index cb8c87d..c117e04 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -443,7 +443,7 @@ compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb dat = dat.list[[ref.set]] ref.cells = ref.list[[ref.set]] ref.dat = dat[select.genes,ref.cells] - ref.cells = colnames(ref.dat)[colSums(ref.dat) > 0] + ref.cells = colnames(ref.dat)[Matrix::colSums(ref.dat) > 0] ref.dat = ref.dat[,ref.cells] map.cells= intersect(select.cells, colnames(dat)) if(length(map.cells)==0){ @@ -559,7 +559,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= if(length(cl) < nrow(result$knn)){ diff.cells = setdiff(row.names(result$knn), names(cl)) pred.df = predict_knn(result$knn[diff.cells,], all.cells, cl )$pred.df - pred.cl= setNames(as.character(pred.df$pred.target), row.names(pred.df)) + pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) cl = c(cl, pred.cl[setdiff(names(pred.cl), names(cl))]) } cl.platform.counts = table(meta.df[names(cl), "platform"],cl) @@ -572,7 +572,7 @@ knn_joint <- function(comb.dat, ref.sets=names(comb.dat$dat.list), select.sets= if(length(bad.cl) > 0){ tmp.cells = names(cl)[cl %in% bad.cl] pred.df = predict_knn(result$knn[tmp.cells,,drop=F], all.cells, cl)$pred.df - pred.cl= setNames(as.character(pred.df$pred.target), row.names(pred.df)) + pred.cl= setNames(as.character(pred.df$pred.cl), row.names(pred.df)) cl[names(pred.cl)]= pred.cl } merge.dat.list = comb.dat$dat.list[merge.sets] diff --git a/R/harmonize_merge.R b/R/harmonize_merge.R index 627f688..a5dc0f3 100644 --- a/R/harmonize_merge.R +++ b/R/harmonize_merge.R @@ -382,7 +382,8 @@ merge_cl_multiple <- function(comb.dat, merge.dat.list, cl, anchor.genes, verbo while (length(unique(cl)) > 1) { ###Find pairs of nearest neighbrs as candidates for merging. k.tmp = pmin(4,ncol(cl.sim)) - nn=colnames(cl.sim)[sim_knn(cl.sim, k= k.tmp)] + nn=colnames(cl.sim)[sim_knn(cl.sim, k= k.tmp)[[1]]] + merge.pairs = data.frame(cl=rep(row.names(cl.sim), length(k.tmp)), nn=nn,stringsAsFactors=FALSE) merge.pairs = merge.pairs[merge.pairs[,1]!=merge.pairs[,2],] merge.pairs$sim = get_pair_matrix(cl.sim, merge.pairs$cl, merge.pairs$nn) diff --git a/R/util.R b/R/util.R index b71a58b..88c79e2 100644 --- a/R/util.R +++ b/R/util.R @@ -264,7 +264,7 @@ get_cl_mat <- function(cl, all.cells=NULL) { #' @return a matrix of genes (rows) x clusters (columns) with sums for each cluster #' @export #' -get_cl_sums <- function(mat, +get_cl_sums_R<- function(mat, cl) { if(all(names(cl) %in% colnames(mat))){ @@ -304,7 +304,7 @@ get_row_means <- function(mat, select.row=1:nrow(mat), select.col=1:ncol(mat)) #' @return a matrix of genes (rows) x clusters (columns) with means for each cluster #' @export #' -get_cl_means <- function(mat, +get_cl_means_R<- function(mat, cl) { cl.sums <- get_cl_sums(mat, cl) @@ -316,7 +316,15 @@ get_cl_means <- function(mat, return(cl.means) } -get_cl_present <- function(mat, cl, low.th) +get_cl_means<- function(mat,cl) { + if(!is.factor(cl)){ + cl = setNames(factor(cl),names(cl)) + } + result=rcpp_get_cl_means(mat, cl) + result[,levels(cl),drop=F] +} + +get_cl_present_R<- function(mat, cl, low.th) { tmp = mat if(is.matrix(tmp)){ @@ -326,8 +334,20 @@ get_cl_present <- function(mat, cl, low.th) tmp@x = as.numeric(tmp@x > low.th) } cl.present = get_cl_means(tmp,cl) + } +get_cl_present<- function(mat, cl, low.th) +{ + if(!is.factor(cl)){ + cl = setNames(factor(cl),names(cl)) + } + + result=rcpp_get_cl_present(mat, cl, low.th) + result[,levels(cl),drop=F] +} + + get_cl_sqr_means<- function(mat, cl) { tmp = mat @@ -340,10 +360,18 @@ get_cl_sqr_means<- function(mat, cl) cl.sqr = get_cl_means(tmp,cl) } +get_cl_sqr_means_new <- function(mat, cl) + { + if(!is.factor(cl)){ + cl = setNames(factor(cl),names(cl)) + } + result=rcpp_get_cl_sqr_means(mat, cl) + result[,levels(cl),drop=F] + } -get_cl_vars <- function(mat, - cl, cl.means=NULL, cl.sqr.means = NULL) { - + +get_cl_vars <- function(mat, cl, cl.means=NULL, cl.sqr.means = NULL) +{ if(is.null(cl.means)){ cl.means = get_cl_means(mat,cl) } @@ -364,7 +392,7 @@ get_cl_vars <- function(mat, #' @return a matrix of genes (rows) x clusters (columns) with medians for each cluster #' @export #' -get_cl_medians <- function(mat, cl) +get_cl_medians_R <- function(mat, cl) { library(Matrix) library(matrixStats) @@ -383,6 +411,13 @@ get_cl_medians <- function(mat, cl) return(cl.med) } +get_cl_medians <- function(mat, cl) + { + if(!is.factor(cl)){ + cl = setNames(factor(cl),names(cl)) + } + rcpp_get_cl_medians(mat, cl) + } #' Compute cluster proportions for each row in a matrix #' From 34735cd8775e1fa1ac6c2a6d8067460133ba2502 Mon Sep 17 00:00:00 2001 From: Zizhen Yao Date: Wed, 14 Jul 2021 14:53:18 -0700 Subject: [PATCH 68/70] change default distance matrix --- R/harmonize.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/harmonize.R b/R/harmonize.R index c117e04..f39a055 100644 --- a/R/harmonize.R +++ b/R/harmonize.R @@ -422,7 +422,7 @@ cleanAnnoyIndex <- function(index) #' @export #' #' @examples -compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, cross.knn.method=c("cor","Annoy.Cosine"), self.knn.method=c("RANN","Annoy.Euclidean"), batch.size=10000, mc.cores=1) +compute_knn <- function(comb.dat, select.genes, ref.list, select.sets=names(comb.dat$dat.list), select.cells=comb.dat$all.cells, k=15, cross.knn.method=c("Annoy.Cosine","cor"), self.knn.method=c("Annoy.Euclidean","RANN"), batch.size=10000, mc.cores=1) { cat("Number of select genes", length(select.genes), "\n") From cb30d7dd54d958c13c08b7a106727e6a4edb8aa0 Mon Sep 17 00:00:00 2001 From: Changkyu Lee Date: Fri, 23 Jul 2021 13:22:31 -0700 Subject: [PATCH 69/70] to deal with missing marker genes in the data --- R/map_to_dend.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/R/map_to_dend.R b/R/map_to_dend.R index 6af6efd..940d749 100644 --- a/R/map_to_dend.R +++ b/R/map_to_dend.R @@ -224,6 +224,8 @@ summarize_cl <- markers.cl.list = do.call("c", markers.cl.list) all.markers = unique(unlist(markers.cl.list)) + # to deal with missing genes + all.markers = intersect(all.markers, rownames(map.dat)) gene.anno="" memb.th = lapply(row.names(memb), function(cell) { ###Check all the node with confidence > conf.th From 8aca4e93148d77cc7e4d5ad910e8df1afa824995 Mon Sep 17 00:00:00 2001 From: Changkyu Lee Date: Fri, 23 Jul 2021 15:26:27 -0700 Subject: [PATCH 70/70] to write out number of missing marker genes --- R/map_to_dend.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/R/map_to_dend.R b/R/map_to_dend.R index 940d749..b47c026 100644 --- a/R/map_to_dend.R +++ b/R/map_to_dend.R @@ -225,7 +225,12 @@ summarize_cl <- all.markers = unique(unlist(markers.cl.list)) # to deal with missing genes - all.markers = intersect(all.markers, rownames(map.dat)) + missing.idx = which(is.na(all.markers, rownames(map.dat))) + if (length(missing.idx) > 0) { + print(paste(length(missing.idx), 'out of', length(all.markers), 'marker genes are missing in map.dat')) + all.markers = all.markers[-missing.idx] + } + gene.anno="" memb.th = lapply(row.names(memb), function(cell) { ###Check all the node with confidence > conf.th