Mercurial > repos > iuc > seurat
view citeseq_Seurat.R @ 15:fab6ff46e019 draft default tip
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/seurat commit b437a46efb50e543b6d7c9988f954efe2caa9046
author | iuc |
---|---|
date | Fri, 07 Jul 2023 01:43:02 +0000 |
parents | |
children |
line wrap: on
line source
#' --- #' title: "Seurat Cite-seq Analysis" #' author: "Performed using Galaxy" #' params: #' rna: "" #' prot: "" #' min_cells: "" #' min_genes: "" #' low_thresholds: "" #' high_thresholds: "" #' numPCs: "" #' resolution: "" #' perplexity: "" #' min_pct: "" #' logfc_threshold: "" #' showcode: "" #' warn: "" #' varstate: "" #' vlnfeat: "" #' featplot: "" #' PCplots: "" #' nmds: "" #' heatmaps: "" #' norm_out: "" #' variable_out: "" #' pca_out : "" #' clusters_out: "" #' markers_out: "" #' cite_markers: "" #' comparison: "" #' feat_comp: "" #' marker_compare: "" #' top_x: "" #' --- # nolint start #+ echo=F, warning = F, message=F options(show.error.messages = F, error = function() { cat(geterrmessage(), file = stderr()); q("no", 1, F) }) # we need that to not crash Galaxy with an UTF-8 error on German LC settings. loc <- Sys.setlocale("LC_MESSAGES", "en_US.UTF-8") showcode <- as.logical(params$showcode) warn <- as.logical(params$warn) varstate <- as.logical(params$varstate) vlnfeat <- as.logical(params$vlnfeat) featplot <- as.logical(params$featplot) pc_plots <- as.logical(params$PCplots) nmds <- as.logical(params$nmds) heatmaps <- as.logical(params$heatmaps) end_step <- as.integer(params$end_step) norm_out <- as.logical(params$norm_out) comparison <- as.logical(params$comparison) feature <- trimws(unlist(strsplit(as.character(params$feat_comp), ","))) marker_compare <- as.logical(params$marker_compare) top_x <- as.integer(params$top_x) min_cells <- as.integer(params$min_cells) min_genes <- as.integer(params$min_genes) low_thresholds <- as.integer(params$low_thresholds) high_thresholds <- as.integer(params$high_thresholds) num_pcs <- as.integer(params$numPCs) cells_use <- as.integer(params$cells_use) resolution <- as.double(params$resolution) min_pct <- as.double(params$min_pct) logfc_threshold <- as.double(params$logfc_thresh) variable_out <- as.logical(params$variable_out) pca_out <- as.logical(params$pca_out) clusters_out <- as.logical(params$clusters_out) markers_out <- as.logical(params$markers_out) print(paste0("Minimum cells: ", min_cells)) print(paste0("Minimum features: ", min_genes)) print(paste0("Umi low threshold: ", low_thresholds)) print(paste0("Umi high threshold: ", high_thresholds)) print(paste0("Number of principal components: ", num_pcs)) print(paste0("Resolution: ", resolution)) print(paste0("Minimum percent of cells", min_pct)) print(paste0("Logfold change threshold", logfc_threshold)) if (params$perplexity == "") { perplexity <- -1 print(paste0("Perplexity: ", perplexity)) } else { perplexity <- as.integer(params$perplexity) print(paste0("Perplexity: ", perplexity)) } #+ echo = FALSE if (showcode == TRUE) print("Read in data, generate inital Seurat object") #+ echo = `showcode`, warning = `warn`, message = F rna <- read.delim(params$rna, row.names = 1) rna <- Seurat::CollapseSpeciesExpressionMatrix(rna) protein <- read.delim(params$prot, row.names = 1) tryCatch(all.equal(colnames(rna), colnames(protein)), error = "Columns do not match in input files") seuset <- Seurat::CreateSeuratObject(counts = rna, min.cells = min_cells, min.features = min_genes) if (showcode == TRUE) print("asdf") #+ echo = `showcode`, warning = `warn`, message = F prot_obj <- Seurat::CreateAssayObject(counts = protein) if (showcode == TRUE) print("qwer") #+ echo = `showcode`, warning = `warn`, message = F seuset[["ADT"]] <- prot_obj if (showcode == TRUE) print("zxcv") #+ echo = `showcode`, warning = `warn`, message = F Seurat::DefaultAssay(seuset) <- "RNA" if (showcode == TRUE && vlnfeat == TRUE) print("Raw data vizualization") #+ echo = `showcode`, warning = `warn`, include=`vlnfeat` if (vlnfeat == TRUE){ print(Seurat::VlnPlot(object = seuset, features = c("nFeature_RNA", "nCount_RNA"))) print(Seurat::FeatureScatter(object = seuset, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")) } if (showcode == TRUE) print("Filter and normalize for UMI counts") #+ echo = `showcode`, warning = `warn` seuset <- subset(seuset, subset = `nCount_RNA` > low_thresholds & `nCount_RNA` < high_thresholds) seuset <- Seurat::NormalizeData(seuset, normalization.method = "LogNormalize", scale.factor = 10000) if (norm_out == TRUE) { saveRDS(seuset, "norm_out.rds") } if (showcode == TRUE && featplot == TRUE) print("Variable Genes") #+ echo = `showcode`, warning = `warn`, include = `featplot` seuset <- Seurat::FindVariableFeatures(object = seuset, selection.method = "mvp") if (featplot == TRUE) { print(Seurat::VariableFeaturePlot(seuset, cols = c("black", "red"), selection.method = "disp")) } seuset <- Seurat::ScaleData(object = seuset, vars.to.regress = "nCount_RNA") if (variable_out == TRUE) { saveRDS(seuset, "var_out.rds") } if (showcode == TRUE && pc_plots == TRUE) print("PCA Visualization") #+ echo = `showcode`, warning = `warn`, include = `pc_plots` seuset <- Seurat::RunPCA(seuset, npcs = num_pcs) seuset <- Seurat::JackStraw(seuset, dims = num_pcs, reduction = "pca", num.replicate = 100) seuset <- Seurat::ScoreJackStraw(seuset, dims = 1:num_pcs) if (pc_plots == TRUE) { print(Seurat::VizDimLoadings(seuset, dims = 1:2)) print(Seurat::DimPlot(seuset, dims = c(1, 2), reduction = "pca")) print(Seurat::DimHeatmap(seuset, dims = 1:num_pcs, nfeatures = 10, reduction = "pca")) print(Seurat::JackStrawPlot(seuset, dims = 1:num_pcs)) print(Seurat::ElbowPlot(seuset, ndims = num_pcs, reduction = "pca")) } if (pca_out == TRUE) { saveRDS(seuset, "pca_out.rds") } if (showcode == TRUE && nmds == TRUE) print("tSNE and UMAP") #+ echo = `showcode`, warning = `warn`, include = `nmds` seuset <- Seurat::FindNeighbors(object = seuset) seuset <- Seurat::FindClusters(object = seuset) if (perplexity == -1) { seuset <- Seurat::RunTSNE(seuset, dims = 1:num_pcs, resolution = resolution, check_duplicates = FALSE) } else { seuset <- Seurat::RunTSNE(seuset, dims = 1:num_pcs, resolution = resolution, perplexity = perplexity, check_duplicates = FALSE) } if (nmds == TRUE) { print(Seurat::DimPlot(seuset, reduction = "tsne")) } seuset <- Seurat::RunUMAP(seuset, dims = 1:num_pcs) if (nmds == TRUE) { print(Seurat::DimPlot(seuset, reduction = "umap")) } if (clusters_out == TRUE) { tsnedata <- Seurat::Embeddings(seuset, reduction="tsne") saveRDS(seuset, "tsne_out.rds") umapdata <- Seurat::Embeddings(seuset, reduction="umap") saveRDS(seuset, "umap_out.rds") } if (showcode == TRUE && heatmaps == TRUE) print("Marker Genes") #+ echo = `showcode`, warning = `warn`, include = `heatmaps` markers <- Seurat::FindAllMarkers(seuset, only.pos = TRUE, min.pct = min_pct, logfc.threshold = logfc_threshold) top10 <- dplyr::group_by(markers, cluster) top10 <- dplyr::top_n(top10, n = 10, wt = avg_log2FC) print(top10) if (heatmaps == TRUE) { print(Seurat::DoHeatmap(seuset, features = top10$gene)) } if (markers_out == TRUE) { saveRDS(seuset, "markers_out.rds") data.table::fwrite(x = markers, row.names=TRUE, sep="\t", file = "markers_out.tsv") } #+ echo = FALSE if (showcode == TRUE && comparison == TRUE) print("Compare") #+ echo = `showcode`, warning = `warn`, include = `comparison` Seurat::DefaultAssay(seuset) <- "ADT" seuset <- Seurat::NormalizeData(seuset, normalization.method = "CLR", margin = 2) Seurat::DefaultAssay(seuset) <- "RNA" seuset <- Seurat::NormalizeData(seuset, normalization.method = "CLR", margin = 2, assay = "ADT") if (comparison == TRUE) { for(x in feature) { Seurat::DefaultAssay(seuset) <- "ADT" p1 <- Seurat::FeaturePlot(seuset, x, cols = c("lightgrey", "red")) + ggplot2::ggtitle(paste0("Protein:", " ", x)) Seurat::DefaultAssay(seuset) <- "RNA" p2 <- Seurat::FeaturePlot(seuset, x) + ggplot2::ggtitle(paste0("RNA:", " ", x)) print(p1 | p2) label <- as.character(paste0(Seurat::Key(seuset[["ADT"]]), x)) print(Seurat::VlnPlot(seuset, paste0("rna_", x))) print(Seurat::VlnPlot(seuset, paste0("adt_", x))) } } #+ echo = FALSE if (showcode == TRUE) print("Cite-seq") #+ echo = `showcode`, warning = `warn`, include = `marker_compare` rna_markers <- Seurat::FindAllMarkers(seuset, only.pos = TRUE, min.pct = min_pct, logfc.threshold = logfc_threshold, assay="RNA") protein_markers <- Seurat::FindAllMarkers(seuset, only.pos = TRUE, min.pct = min_pct, logfc.threshold = logfc_threshold, assay="ADT") if (marker_compare == TRUE) { data.table::fwrite(x = rna_markers, sep="\t", file = "rna_out.tsv") data.table::fwrite(x = protein_markers, sep="\t", file = "protein_out.tsv") } toprna <- dplyr::top_n(dplyr::group_by(rna_markers, cluster), n=5, avg_log2FC) toprna <- head(as.list(unique(as.data.frame(toprna)$gene)), top_x) topprot <- dplyr::top_n(dplyr::group_by(protein_markers, cluster), n=5, avg_log2FC) topprot <- head(as.list(unique(as.data.frame(topprot)$gene)), top_x) if(marker_compare == TRUE) { pdf(file="citeseq_out.pdf") rna_labels <- as.vector(toprna) rna_labels <- rna_labels[!duplicated(rna_labels)] prot_labels <- as.vector(topprot) prot_labels <- prot_labels[!duplicated(prot_labels)] for(rnamarker in rna_labels) { rnamarker <- paste("rna_", rnamarker, sep = "") for(protmarker in prot_labels) { protmarker <- paste("adt_", protmarker, sep="") plot <- Seurat::FeatureScatter(seuset, feature1 = rnamarker, feature2 = protmarker) + ggplot2::ggtitle(paste0(rnamarker, " vs ", protmarker)) print(plot) } } for(rnamarker in rna_labels) { rnamarker <- paste("rna_", rnamarker, sep = "") for(rnamarker2 in rna_labels) { rnamarker2 <- paste("rna_", rnamarker2, sep="") plot <- Seurat::FeatureScatter(seuset, feature1 = rnamarker, feature2 = rnamarker2) + ggplot2::ggtitle(paste0(rnamarker, " vs ", rnamarker2)) print(plot) } } for(protmarker in prot_labels) { protmarker <- paste("adt_", protmarker, sep = "") for(protmarker2 in prot_labels) { protmarker2 <- paste("adt_", protmarker2, sep="") plot <- Seurat::FeatureScatter(seuset, feature1 = protmarker, feature2 = protmarker2) + ggplot2::ggtitle(paste0(protmarker, " vs ", protmarker2)) print(plot) } } dev.off() } # nolint end