###############################################################
###############################################################
##--------------------------------------------------------------
##--------------------------------------------------------------
library(dplyr) library(tidyverse) library(ggplot2) library(ggrepel) library(patchwork) library(ggpubr)
library(Seurat) library(SeuratObject) library(glmGamPoi)
library(clusterProfiler) library(org.Mm.eg.db) library(DOSE) library(enrichR)
library(tibble) library(stringr) library(openxlsx) library(writexl) library(parallel) library(future) library(CellChat) library(monocle3) library(Nebulosa) library(pheatmap)
library(devtools)
##--------------------------------------------------------------
##--------------------------------------------------------------
obj <- readRDS(file = "D2A1plus_PYMT_1-merged-object.RDS")
cat("β Merged Seurat object successfully loaded.\n")
print(obj) head(obj@meta.data)
##--------------------------------------------------------------
##--------------------------------------------------------------
cat("π Running QC metrics...\n")
ncells.before.qc.filter <- ncol(obj) cat("Cells before QC filtering:", ncells.before.qc.filter, "\n")
obj[["percent.mt"]] <- PercentageFeatureSet(obj, pattern = "^mt-")
VlnPlot(obj, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
plot1 <- FeatureScatter(obj, feature1 = "nCount_RNA", feature2 = "percent.mt") plot2 <- FeatureScatter(obj, feature1 = "nCount_RNA", feature2 = "nFeature_RNA") plot1 + plot2
##--------------------------------------------------------------
##--------------------------------------------------------------
cat("π§Ή Filtering low-quality cells...\n")
obj <- subset(obj, subset = nFeature_RNA > 200 & nFeature_RNA < 100000 & percent.mt < 10)
ncells.after.qc.filter <- ncol(obj)
ncells.filtered <- ncells.before.qc.filter - ncells.after.qc.filter percent.filtered <- round((ncells.filtered / ncells.before.qc.filter) * 100, 2)
cat("Cells after filtering:", ncells.after.qc.filter, "\n") cat("Filtered out:", ncells.filtered, "cells (", percent.filtered, "%)\n")
qc_results <- data.frame( Metric = c("Number of cells before QC", "Number of cells after QC", "Number of cells filtered", "Percent filtered"), Value = c(ncells.before.qc.filter, ncells.after.qc.filter, ncells.filtered, percent.filtered) )
print(qc_results)
write.csv( qc_results, file = file.path(getwd(), "results", "tables", "1-qc_filtering_results.csv"), row.names = FALSE )
saveRDS(obj, file = "2-QCfiltered-object.RDS") cat("β QC-filtered Seurat object saved.\n")
##--------------------------------------------------------------
##--------------------------------------------------------------
cat("βοΈ Running SCTransform normalization (this may take a while)...\n")
obj <- readRDS(file = "2-QCfiltered-object.RDS")
options(future.globals.maxSize = 8000 * 1024^2) # 8 GB memory cap (adjust as needed)
obj <- SCTransform( obj, vars.to.regress = "percent.mt", verbose = TRUE )
cat("β SCTransform normalization complete.\n")
saveRDS(obj, file = "3-SCtransform-object.RDS")
obj <- readRDS("3-SCtransform-object.RDS")
cat("π¦ SCTransformed Seurat object loaded and ready for downstream analysis.\n")
##--------------------------------------------------------------
##--------------------------------------------------------------
###############################################################