load libraries
Load Seurat Object
All_samples_Merged <- readRDS("../../../../Seurat_RDS_Final_OBJECT/All_samples_Merged_with_Renamed_Clusters_final-26-10-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%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Run CyteTypeR for
cluster annotation
Idents(All_samples_Merged) <- "seurat_clusters"
# ---------------------------------------------------------
# 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)
[1] "TRAV17" "TRAV9-2" "RPL22L1" "RPL7" "RPL35A" "NEAT1"
# Filter markers (keep important metabolic/proliferation genes)
SS_markers_filtered <- SS_markers %>%
filter(!grepl(blacklist_regex, gene, ignore.case = TRUE))
Run CyteTypeR for
cluster annotation


LS0tCnRpdGxlOiAiQ3l0ZVR5cGVSIEFubm90YXRpb24gdXNpbmcgQUktRmluYWxpemVkIgphdXRob3I6ICJOYXNpciBNYWhtb29kIEFiYmFzaSIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgoKIyBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBMb2FkIGJlbG93IGxpYnJhcmllcwpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoY293cGxvdCkKCgpsaWJyYXJ5KFNDcHVicikKbGlicmFyeShkcGx5cikKYGBgCgoKIyBMb2FkIFNldXJhdCBPYmplY3QgCmBgYHtyfQoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIHJlYWRSRFMoIi4uLy4uLy4uLy4uL1NldXJhdF9SRFNfRmluYWxfT0JKRUNUL0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1JlbmFtZWRfQ2x1c3RlcnNfZmluYWwtMjYtMTAtMjAyNS5yZHMiKQoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlJOQSIKCiMgSWYgUk5BIGhhcyBub3QgYmVlbiBub3JtYWxpemVkIHlldCwgcnVuIE5vcm1hbGl6ZURhdGEgKHNhZmUgdG8gcnVuIGFnYWluKQpBbGxfc2FtcGxlc19NZXJnZWQgPC0gTm9ybWFsaXplRGF0YShBbGxfc2FtcGxlc19NZXJnZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLmZhY3RvciA9IDFlNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgpgYGAKCiMgUnVuIEN5dGVUeXBlUiBmb3IgY2x1c3RlciBhbm5vdGF0aW9uCmBgYHtyfQpJZGVudHMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAy77iP4oOjIEZpbmQgbWFya2VyIGdlbmVzIHBlciBjbHVzdGVyClNTX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoCiAgQWxsX3NhbXBsZXNfTWVyZ2VkLAogIG9ubHkucG9zID0gVFJVRSwKICBtaW4ucGN0ID0gMC4yNSwKICBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LAogIG1pbi5wY3QuZGlmZiA9IDAuMgogIAopCgpsaWJyYXJ5KGRwbHlyKQoKIyBQcmVjaXNlIGJsYWNrbGlzdCBmb3IgdW5pbmZvcm1hdGl2ZSBnZW5lcwpibGFja2xpc3RfcGF0dGVybnMgPC0gYygKICAiXlRSQVYiLCAiXlRSQlYiLCAiXlRSR1YiLCAiXlRSRFYiLCAiXlRSQkMiLCAiXlRSQUMiLCAiXlRSREMiLCAiXlRSR0MiLCAjIFRDUgogICJeSUdIIiwgIl5JR0siLCAiXklHTCIsICJeSUdKIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWcgZ2VuZXMKICAiXlJQTCIsICJeUlBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpYm9zb21hbAogICJeTVQtIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWl0b2Nob25kcmlhCiAgIl5IQkEiLCAiXkhCQiIsICJeSEJbQUJaXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZW1vZ2xvYmlucwogICJeTkVBVDEkIiwgIl5NQUxBVDEkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgbG5jUk5BcwogICJeWElTVCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKYmxhY2tsaXN0X3JlZ2V4IDwtIHBhc3RlKGJsYWNrbGlzdF9wYXR0ZXJucywgY29sbGFwc2UgPSAifCIpCgojIFByZXZpZXcgd2hpY2ggbWFya2VycyB3aWxsIGJlIHJlbW92ZWQKdG9fcmVtb3ZlIDwtIFNTX21hcmtlcnMgJT4lCiAgZmlsdGVyKGdyZXBsKGJsYWNrbGlzdF9yZWdleCwgZ2VuZSwgaWdub3JlLmNhc2UgPSBUUlVFKSkKbWVzc2FnZSgiUm93cyB0byByZW1vdmU6ICIsIG5yb3codG9fcmVtb3ZlKSkKaGVhZCh0b19yZW1vdmUkZ2VuZSkKCiMgRmlsdGVyIG1hcmtlcnMgKGtlZXAgaW1wb3J0YW50IG1ldGFib2xpYy9wcm9saWZlcmF0aW9uIGdlbmVzKQpTU19tYXJrZXJzX2ZpbHRlcmVkIDwtIFNTX21hcmtlcnMgJT4lCiAgZmlsdGVyKCFncmVwbChibGFja2xpc3RfcmVnZXgsIGdlbmUsIGlnbm9yZS5jYXNlID0gVFJVRSkpCgoKYGBgCgojIFJ1biBDeXRlVHlwZVIgZm9yIGNsdXN0ZXIgYW5ub3RhdGlvbgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CmxpYnJhcnkoQ3l0ZVR5cGVSKQpsaWJyYXJ5KGRwbHlyKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmVwYXJlIGRhdGEgZm9yIEN5dGVUeXBlUgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcHJlcHBlZF9kYXRhIDwtIFByZXBhcmVDeXRlVHlwZVIoCiAgb2JqID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogIFNTX21hcmtlcnNfZmlsdGVyZWQsCiAgbl90b3BfZ2VuZXMgPSAxMCwgICAgICAgICAgICAgICAjIHRvcCAxMCBtYXJrZXIgZ2VuZXMgcGVyIGNsdXN0ZXIKICBncm91cF9rZXkgPSAnc2V1cmF0X2NsdXN0ZXJzJywgICMgbXVzdCBtYXRjaCBTZXVyYXQgb2JqZWN0CiAgYWdncmVnYXRlX21ldGFkYXRhID0gVFJVRSwKICBjb29yZGluYXRlc19rZXkgPSAidW1hcCIKKQoKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNZXRhZGF0YSBmb3IgQ3l0ZVR5cGVSCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptZXRhZGF0YSA8LSBsaXN0KAogIHRpdGxlID0gJ1PDqXphcnkgc3luZHJvbWUgc2luZ2xlLWNlbGwgYW5hbHlzaXMnLAogIHJ1bl9sYWJlbCA9ICdTU19jZWxsX2xpbmVzX2FuYWx5c2lzJywKICBleHBlcmltZW50X25hbWUgPSAnNyBTUyBjZWxsIGxpbmVzICsgMiBoZWFsdGh5IENENCBUIGNlbGxzJwopCgoKIyBSZW1vdmUgYm90aCBsaXRlcmFsICJOQSIgYW5kIHRydWUgTkEgbmFtZXMKcHJlcHBlZF9kYXRhJGNsdXN0ZXJNZXRhZGF0YSA8LSBwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhWwogICFpcy5uYShuYW1lcyhwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhKSkgJiAKICBuYW1lcyhwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhKSAhPSAiTkEiCl0KCiMgQ29uZmlybSBjbGVhbnVwCm5hbWVzKHByZXBwZWRfZGF0YSRjbHVzdGVyTWV0YWRhdGEpCgoKCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUnVuIEN5dGVUeXBlUgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcmVzdWx0cyA8LSBDeXRlVHlwZVIoCiAgb2JqID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogIHByZXBwZWRfZGF0YSA9IHByZXBwZWRfZGF0YSwKICBzdHVkeV9jb250ZXh0ID0gIlNlemFyeSBzeW5kcm9tZSA3IGNlbGwgbGluZXMgQ0Q0IFQgY2VsbHMgbWFsaWduYW50IGRlcml2ZWQgZnJvbSBibG9vZCBzYW1wbGVzIGFuZCAyIGhlYWx0aHkgZG9ub3IgQ0Q0IFQgY2VsbHMgZnJvbSBQQk1DLiBDTFVTVEVSIDQgQU5EIENMVVNURVIgMTEgQVJFIGhSQUxUSFkgRE9OT1IgQ0VMTCBDTFVTVEVSUyIsCiAgbWV0YWRhdGEgPSBtZXRhZGF0YQopCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDaGVjayByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIElmIGpvYiBzdWNjZWVkcywgcmV0cmlldmUgcmVzdWx0czoKIyBHZXRSZXN1bHRzKHJlc3VsdHMpCgpzYXZlUkRTKHJlc3VsdHMsIGZpbGUgPSAiQ3l0ZVR5cGVSX3Jlc3VsdHNfU1NfY2VsbF9saW5lc19maW5hbGl6ZWQucmRzIikKCkRpbVBsb3QocmVzdWx0cywgZ3JvdXAuYnkgPSAiY3l0ZXR5cGVfY2VsbF9vbnRvbG9neV9zZXVyYXRfY2x1c3RlcnMiLCBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQscmVwZWwgPSBULCByZWR1Y3Rpb24gPSAidW1hcCIpCkRpbVBsb3QocmVzdWx0cywgZ3JvdXAuYnkgPSAiY3l0ZXR5cGVfc2V1cmF0X2NsdXN0ZXJzIiwgbGFiZWwgPSBGLCBsYWJlbC5ib3ggPSBULHJlcGVsID0gVCwgcmVkdWN0aW9uID0gInVtYXAiKQoKYGBg