1 load libraries

2 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%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

3 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))

4 Run CyteTypeR for cluster annotation

LS0tCnRpdGxlOiAiQ3l0ZVR5cGVSIEFubm90YXRpb24gdXNpbmcgQUktRmluYWxpemVkIgphdXRob3I6ICJOYXNpciBNYWhtb29kIEFiYmFzaSIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWQsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgoKIyBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBMb2FkIGJlbG93IGxpYnJhcmllcwpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoY293cGxvdCkKCgpsaWJyYXJ5KFNDcHVicikKbGlicmFyeShkcGx5cikKYGBgCgoKIyBMb2FkIFNldXJhdCBPYmplY3QgCmBgYHtyfQoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIHJlYWRSRFMoIi4uLy4uLy4uLy4uL1NldXJhdF9SRFNfRmluYWxfT0JKRUNUL0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1JlbmFtZWRfQ2x1c3RlcnNfZmluYWwtMjYtMTAtMjAyNS5yZHMiKQoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlJOQSIKCiMgSWYgUk5BIGhhcyBub3QgYmVlbiBub3JtYWxpemVkIHlldCwgcnVuIE5vcm1hbGl6ZURhdGEgKHNhZmUgdG8gcnVuIGFnYWluKQpBbGxfc2FtcGxlc19NZXJnZWQgPC0gTm9ybWFsaXplRGF0YShBbGxfc2FtcGxlc19NZXJnZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6YXRpb24ubWV0aG9kID0gIkxvZ05vcm1hbGl6ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLmZhY3RvciA9IDFlNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgpgYGAKCiMgUnVuIEN5dGVUeXBlUiBmb3IgY2x1c3RlciBhbm5vdGF0aW9uCmBgYHtyfQpJZGVudHMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAy77iP4oOjIEZpbmQgbWFya2VyIGdlbmVzIHBlciBjbHVzdGVyClNTX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoCiAgQWxsX3NhbXBsZXNfTWVyZ2VkLAogIG9ubHkucG9zID0gVFJVRSwKICBtaW4ucGN0ID0gMC4yNSwKICBsb2dmYy50aHJlc2hvbGQgPSAwLjI1LAogIG1pbi5wY3QuZGlmZiA9IDAuMgogIAopCgpsaWJyYXJ5KGRwbHlyKQoKIyBQcmVjaXNlIGJsYWNrbGlzdCBmb3IgdW5pbmZvcm1hdGl2ZSBnZW5lcwpibGFja2xpc3RfcGF0dGVybnMgPC0gYygKICAiXlRSQVYiLCAiXlRSQlYiLCAiXlRSR1YiLCAiXlRSRFYiLCAiXlRSQkMiLCAiXlRSQUMiLCAiXlRSREMiLCAiXlRSR0MiLCAjIFRDUgogICJeSUdIIiwgIl5JR0siLCAiXklHTCIsICJeSUdKIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWcgZ2VuZXMKICAiXlJQTCIsICJeUlBTIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpYm9zb21hbAogICJeTVQtIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWl0b2Nob25kcmlhCiAgIl5IQkEiLCAiXkhCQiIsICJeSEJbQUJaXSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZW1vZ2xvYmlucwogICJeTkVBVDEkIiwgIl5NQUxBVDEkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgbG5jUk5BcwogICJeWElTVCQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKYmxhY2tsaXN0X3JlZ2V4IDwtIHBhc3RlKGJsYWNrbGlzdF9wYXR0ZXJucywgY29sbGFwc2UgPSAifCIpCgojIFByZXZpZXcgd2hpY2ggbWFya2VycyB3aWxsIGJlIHJlbW92ZWQKdG9fcmVtb3ZlIDwtIFNTX21hcmtlcnMgJT4lCiAgZmlsdGVyKGdyZXBsKGJsYWNrbGlzdF9yZWdleCwgZ2VuZSwgaWdub3JlLmNhc2UgPSBUUlVFKSkKbWVzc2FnZSgiUm93cyB0byByZW1vdmU6ICIsIG5yb3codG9fcmVtb3ZlKSkKaGVhZCh0b19yZW1vdmUkZ2VuZSkKCiMgRmlsdGVyIG1hcmtlcnMgKGtlZXAgaW1wb3J0YW50IG1ldGFib2xpYy9wcm9saWZlcmF0aW9uIGdlbmVzKQpTU19tYXJrZXJzX2ZpbHRlcmVkIDwtIFNTX21hcmtlcnMgJT4lCiAgZmlsdGVyKCFncmVwbChibGFja2xpc3RfcmVnZXgsIGdlbmUsIGlnbm9yZS5jYXNlID0gVFJVRSkpCgoKYGBgCgojIFJ1biBDeXRlVHlwZVIgZm9yIGNsdXN0ZXIgYW5ub3RhdGlvbgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CmxpYnJhcnkoQ3l0ZVR5cGVSKQpsaWJyYXJ5KGRwbHlyKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQcmVwYXJlIGRhdGEgZm9yIEN5dGVUeXBlUgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcHJlcHBlZF9kYXRhIDwtIFByZXBhcmVDeXRlVHlwZVIoCiAgb2JqID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogIFNTX21hcmtlcnNfZmlsdGVyZWQsCiAgbl90b3BfZ2VuZXMgPSAxMCwgICAgICAgICAgICAgICAjIHRvcCAxMCBtYXJrZXIgZ2VuZXMgcGVyIGNsdXN0ZXIKICBncm91cF9rZXkgPSAnc2V1cmF0X2NsdXN0ZXJzJywgICMgbXVzdCBtYXRjaCBTZXVyYXQgb2JqZWN0CiAgYWdncmVnYXRlX21ldGFkYXRhID0gVFJVRSwKICBjb29yZGluYXRlc19rZXkgPSAidW1hcCIKKQoKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNZXRhZGF0YSBmb3IgQ3l0ZVR5cGVSCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptZXRhZGF0YSA8LSBsaXN0KAogIHRpdGxlID0gJ1PDqXphcnkgc3luZHJvbWUgc2luZ2xlLWNlbGwgYW5hbHlzaXMnLAogIHJ1bl9sYWJlbCA9ICdTU19jZWxsX2xpbmVzX2FuYWx5c2lzJywKICBleHBlcmltZW50X25hbWUgPSAnNyBTUyBjZWxsIGxpbmVzICsgMiBoZWFsdGh5IENENCBUIGNlbGxzJwopCgoKIyBSZW1vdmUgYm90aCBsaXRlcmFsICJOQSIgYW5kIHRydWUgTkEgbmFtZXMKcHJlcHBlZF9kYXRhJGNsdXN0ZXJNZXRhZGF0YSA8LSBwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhWwogICFpcy5uYShuYW1lcyhwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhKSkgJiAKICBuYW1lcyhwcmVwcGVkX2RhdGEkY2x1c3Rlck1ldGFkYXRhKSAhPSAiTkEiCl0KCiMgQ29uZmlybSBjbGVhbnVwCm5hbWVzKHByZXBwZWRfZGF0YSRjbHVzdGVyTWV0YWRhdGEpCgoKCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUnVuIEN5dGVUeXBlUgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcmVzdWx0cyA8LSBDeXRlVHlwZVIoCiAgb2JqID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogIHByZXBwZWRfZGF0YSA9IHByZXBwZWRfZGF0YSwKICBzdHVkeV9jb250ZXh0ID0gIlNlemFyeSBzeW5kcm9tZSA3IGNlbGwgbGluZXMgQ0Q0IFQgY2VsbHMgbWFsaWduYW50IGRlcml2ZWQgZnJvbSBibG9vZCBzYW1wbGVzIGFuZCAyIGhlYWx0aHkgZG9ub3IgQ0Q0IFQgY2VsbHMgZnJvbSBQQk1DLiBDTFVTVEVSIDQgQU5EIENMVVNURVIgMTEgQVJFIGhSQUxUSFkgRE9OT1IgQ0VMTCBDTFVTVEVSUyIsCiAgbWV0YWRhdGEgPSBtZXRhZGF0YQopCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDaGVjayByZXN1bHRzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIElmIGpvYiBzdWNjZWVkcywgcmV0cmlldmUgcmVzdWx0czoKIyBHZXRSZXN1bHRzKHJlc3VsdHMpCgpzYXZlUkRTKHJlc3VsdHMsIGZpbGUgPSAiQ3l0ZVR5cGVSX3Jlc3VsdHNfU1NfY2VsbF9saW5lc19maW5hbGl6ZWQucmRzIikKCkRpbVBsb3QocmVzdWx0cywgZ3JvdXAuYnkgPSAiY3l0ZXR5cGVfY2VsbF9vbnRvbG9neV9zZXVyYXRfY2x1c3RlcnMiLCBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQscmVwZWwgPSBULCByZWR1Y3Rpb24gPSAidW1hcCIpCkRpbVBsb3QocmVzdWx0cywgZ3JvdXAuYnkgPSAiY3l0ZXR5cGVfc2V1cmF0X2NsdXN0ZXJzIiwgbGFiZWwgPSBGLCBsYWJlbC5ib3ggPSBULHJlcGVsID0gVCwgcmVkdWN0aW9uID0gInVtYXAiKQoKYGBg