1. load libraries
2. Load Seurat Object
All_samples_Merged <- readRDS("../0-Seurat_RDS_OBJECT_FINAL/Seurat_object_Final_changes/All_samples_Merged_with_STCAT_Annotation_final-5-09-2025.rds")
DefaultAssay(All_samples_Merged) <- "RNA"
# If RNA has not been normalized yet, run NormalizeData (safe to run again)
All_samples_Merged <- NormalizeData(All_samples_Merged,
normalization.method = "LogNormalize",
scale.factor = 1e4,
verbose = TRUE)
Performing log-normalization
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
3. Run CytypeR for cluster annotation
Idents(All_samples_Merged) <- "seurat_clusters"
# ---------------------------------------------------------
# 1️⃣ Load library
library(CyteTypeR)
library(dplyr)
# ---------------------------------------------------------
# 2️⃣ Find marker genes per cluster
SS_markers <- FindAllMarkers(
All_samples_Merged,
only.pos = TRUE,
min.pct = 0.25,
logfc.threshold = 0.25,
min.pct.diff = 0.2
)
library(dplyr)
# Precise blacklist for uninformative genes
blacklist_patterns <- c(
"^TRAV", "^TRBV", "^TRGV", "^TRDV", "^TRBC", "^TRAC", "^TRDC", "^TRGC", # TCR
"^IGH", "^IGK", "^IGL", "^IGJ", # Ig genes
"^RPL", "^RPS", # ribosomal
"^MT-", # mitochondria
"^HBA", "^HBB", "^HB[ABZ]", # hemoglobins
"^NEAT1$", "^MALAT1$", # optional lncRNAs
"^XIST" )
blacklist_regex <- paste(blacklist_patterns, collapse = "|")
# Preview which markers will be removed
to_remove <- SS_markers %>%
filter(grepl(blacklist_regex, gene, ignore.case = TRUE))
message("Rows to remove: ", nrow(to_remove))
head(to_remove$gene)
# Filter markers (keep important metabolic/proliferation genes)
SS_markers_filtered <- SS_markers %>%
filter(!grepl(blacklist_regex, gene, ignore.case = TRUE))
4. Top25 and Top5 Markers
3. Run CytypeR for cluster annotation


LS0tCnRpdGxlOiAiQ3l0eXBlIHRvcDUgbWFya2VycyBhbmQgQ2x1c3RlciBBbm5vdGF0aW9uIgphdXRob3I6ICJOYXNpciBNYWhtb29kIEFiYmFzaSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIExvYWQgYmVsb3cgbGlicmFyaWVzCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjb3dwbG90KQoKCmxpYnJhcnkoU0NwdWJyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgojIDIuIExvYWQgU2V1cmF0IE9iamVjdCAKYGBge3J9CgpBbGxfc2FtcGxlc19NZXJnZWQgPC0gcmVhZFJEUygiLi4vMC1TZXVyYXRfUkRTX09CSkVDVF9GSU5BTC9TZXVyYXRfb2JqZWN0X0ZpbmFsX2NoYW5nZXMvQWxsX3NhbXBsZXNfTWVyZ2VkX3dpdGhfU1RDQVRfQW5ub3RhdGlvbl9maW5hbC01LTA5LTIwMjUucmRzIikKCkRlZmF1bHRBc3NheShBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJSTkEiCgojIElmIFJOQSBoYXMgbm90IGJlZW4gbm9ybWFsaXplZCB5ZXQsIHJ1biBOb3JtYWxpemVEYXRhIChzYWZlIHRvIHJ1biBhZ2FpbikKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIE5vcm1hbGl6ZURhdGEoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJMb2dOb3JtYWxpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZS5mYWN0b3IgPSAxZTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKYGBgCgojIDMuIFJ1biBDeXR5cGVSIGZvciBjbHVzdGVyIGFubm90YXRpb24KYGBge3J9CklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJzZXVyYXRfY2x1c3RlcnMiCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDHvuI/ig6MgTG9hZCBsaWJyYXJ5CmxpYnJhcnkoQ3l0ZVR5cGVSKQpsaWJyYXJ5KGRwbHlyKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAy77iP4oOjIEZpbmQgbWFya2VyIGdlbmVzIHBlciBjbHVzdGVyClNTX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoCiAgQWxsX3NhbXBsZXNfTWVyZ2VkLAogIG9ubHkucG9zID0gVFJVRSwKICBtaW4ucGN0ID0gMC4yNSwKICBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LAogIG1pbi5wY3QuZGlmZiA9IDAuMgopCgpsaWJyYXJ5KGRwbHlyKQoKIyBQcmVjaXNlIGJsYWNrbGlzdCBmb3IgdW5pbmZvcm1hdGl2ZSBnZW5lcwpibGFja2xpc3RfcGF0dGVybnMgPC0gYygKICAiXlRSQVYiLCAiXlRSQlYiLCAiXlRSR1YiLCAiXlRSRFYiLCAiXlRSQkMiLCAiXlRSQUMiLCAiXlRSREMiLCAiXlRSR0MiLCAjIFRDUgogICJeSUdIIiwgIl5JR0siLCAiXklHTCIsICJeSUdKIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWcgZ2VuZXMKICAiXlJQTCIsICJeUlBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpYm9zb21hbAogICJeTVQtIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWl0b2Nob25kcmlhCiAgIl5IQkEiLCAiXkhCQiIsICJeSEJbQUJaXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZW1vZ2xvYmlucwogICJeTkVBVDEkIiwgIl5NQUxBVDEkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgbG5jUk5BcwogICJeWElTVCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCgpibGFja2xpc3RfcmVnZXggPC0gcGFzdGUoYmxhY2tsaXN0X3BhdHRlcm5zLCBjb2xsYXBzZSA9ICJ8IikKCiMgUHJldmlldyB3aGljaCBtYXJrZXJzIHdpbGwgYmUgcmVtb3ZlZAp0b19yZW1vdmUgPC0gU1NfbWFya2VycyAlPiUKICBmaWx0ZXIoZ3JlcGwoYmxhY2tsaXN0X3JlZ2V4LCBnZW5lLCBpZ25vcmUuY2FzZSA9IFRSVUUpKQptZXNzYWdlKCJSb3dzIHRvIHJlbW92ZTogIiwgbnJvdyh0b19yZW1vdmUpKQpoZWFkKHRvX3JlbW92ZSRnZW5lKQoKIyBGaWx0ZXIgbWFya2VycyAoa2VlcCBpbXBvcnRhbnQgbWV0YWJvbGljL3Byb2xpZmVyYXRpb24gZ2VuZXMpClNTX21hcmtlcnNfZmlsdGVyZWQgPC0gU1NfbWFya2VycyAlPiUKICBmaWx0ZXIoIWdyZXBsKGJsYWNrbGlzdF9yZWdleCwgZ2VuZSwgaWdub3JlLmNhc2UgPSBUUlVFKSkKCgpgYGAKCgojIDQuIFRvcDI1IGFuZCBUb3A1IE1hcmtlcnMKYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQoKbGlicmFyeShkcGx5cikKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU2F2ZSBmaWx0ZXJlZCBtYXJrZXJzCndyaXRlLmNzdihTU19tYXJrZXJzX2ZpbHRlcmVkLCBmaWxlID0gIlNTX21hcmtlcnNfZmlsdGVyZWQuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEV4dHJhY3QgdG9wIDI1IG1hcmtlcnMgcGVyIGNsdXN0ZXIKdG9wMjVfbWFya2VycyA8LSBTU19tYXJrZXJzX2ZpbHRlcmVkICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGF2Z19sb2cyRkMsIG4gPSAyNSkgJT4lCiAgdW5ncm91cCgpCgp3cml0ZS5jc3YodG9wMjVfbWFya2VycywgZmlsZSA9ICJTU19tYXJrZXJzX3RvcDI1LmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFeHRyYWN0IHRvcCA1IG1hcmtlcnMgcGVyIGNsdXN0ZXIKdG9wNV9tYXJrZXJzIDwtIFNTX21hcmtlcnNfZmlsdGVyZWQgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYXZnX2xvZzJGQywgbiA9IDUpICU+JQogIHVuZ3JvdXAoKQoKd3JpdGUuY3N2KHRvcDVfbWFya2VycywgZmlsZSA9ICJTU19tYXJrZXJzX3RvcDUuY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCgptZXNzYWdlKCJGaWx0ZXJlZCBtYXJrZXJzLCB0b3AyNSwgYW5kIHRvcDUgbWFya2VycyBzYXZlZCBzdWNjZXNzZnVsbHkuIikKCmBgYAojIDMuIFJ1biBDeXR5cGVSIGZvciBjbHVzdGVyIGFubm90YXRpb24KYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJlcGFyZSBkYXRhIGZvciBDeXRlVHlwZVIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnByZXBwZWRfZGF0YSA8LSBQcmVwYXJlQ3l0ZVR5cGVSKAogIG9iaiA9IEFsbF9zYW1wbGVzX01lcmdlZCwKICBTU19tYXJrZXJzX2ZpbHRlcmVkLAogIG5fdG9wX2dlbmVzID0gNSwgICAgICAgICAgICAgICAjIHRvcCAxMCBtYXJrZXIgZ2VuZXMgcGVyIGNsdXN0ZXIKICBncm91cF9rZXkgPSAnc2V1cmF0X2NsdXN0ZXJzJywgICMgbXVzdCBtYXRjaCBTZXVyYXQgb2JqZWN0CiAgYWdncmVnYXRlX21ldGFkYXRhID0gVFJVRSwKICBjb29yZGluYXRlc19rZXkgPSAidW1hcCIKKQoKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNZXRhZGF0YSBmb3IgQ3l0ZVR5cGVSCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptZXRhZGF0YSA8LSBsaXN0KAogIHRpdGxlID0gJ1PDqXphcnkgc3luZHJvbWUgc2luZ2xlLWNlbGwgYW5hbHlzaXMnLAogIHJ1bl9sYWJlbCA9ICdTU19jZWxsX2xpbmVzX2FuYWx5c2lzJywKICBleHBlcmltZW50X25hbWUgPSAnNyBTUyBjZWxsIGxpbmVzICsgMiBoZWFsdGh5IENENCBUIGNlbGxzIGZyb20gaGVhbHRoeSBkb25vcnMnCikKCgojIFJlbW92ZSBib3RoIGxpdGVyYWwgIk5BIiBhbmQgdHJ1ZSBOQSBuYW1lcwpwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhIDwtIHByZXBwZWRfZGF0YSRjbHVzdGVyTWV0YWRhdGFbCiAgIWlzLm5hKG5hbWVzKHByZXBwZWRfZGF0YSRjbHVzdGVyTWV0YWRhdGEpKSAmIAogIG5hbWVzKHByZXBwZWRfZGF0YSRjbHVzdGVyTWV0YWRhdGEpICE9ICJOQSIKXQoKIyBDb25maXJtIGNsZWFudXAKbmFtZXMocHJlcHBlZF9kYXRhJGNsdXN0ZXJNZXRhZGF0YSkKCgoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFJ1biBDeXRlVHlwZVIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnJlc3VsdHMgPC0gQ3l0ZVR5cGVSKAogIG9iaiA9IEFsbF9zYW1wbGVzX01lcmdlZCwKICBwcmVwcGVkX2RhdGEgPSBwcmVwcGVkX2RhdGEsCiAgc3R1ZHlfY29udGV4dCA9ICJTZXphcnkgc3luZHJvbWUgNyBjZWxsIGxpbmVzIENENCBUIGNlbGxzIG1hbGlnbmFudCBkZXJpdmVkIGZyb20gYmxvb2Qgc2FtcGxlcyBhbmQgMiBoZWFsdGh5IGRvbm9yIENENCBUIGNlbGxzIGZyb20gUEJNQyBhbmQgY2x1c3RlciA0IGFuZCAxMSBhcmUgZnJvbSBoZWFsdGh5IENENCBUIGNlbGxzICIsCiAgbWV0YWRhdGEgPSBtZXRhZGF0YQopCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDaGVjayByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIElmIGpvYiBzdWNjZWVkcywgcmV0cmlldmUgcmVzdWx0czoKIyBHZXRSZXN1bHRzKHJlc3VsdHMpCgpzYXZlUkRTKHJlc3VsdHMsIGZpbGUgPSAiQ3l0ZVR5cGVSX3Jlc3VsdHNfU1NfY2VsbF9saW5lc190b3A1bWFya2Vycy5yZHMiKQoKRGltUGxvdChyZXN1bHRzLCBncm91cC5ieSA9ICJjeXRldHlwZV9jZWxsX29udG9sb2d5X3NldXJhdF9jbHVzdGVycyIsIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCxyZXBlbCA9IFQsIHJlZHVjdGlvbiA9ICJ1bWFwIikKRGltUGxvdChyZXN1bHRzLCBncm91cC5ieSA9ICJjeXRldHlwZV9zZXVyYXRfY2x1c3RlcnMiLCBsYWJlbCA9IEYsIGxhYmVsLmJveCA9IEYscmVwZWwgPSBGLCByZWR1Y3Rpb24gPSAidW1hcCIpCgpgYGA=