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")
3. Load the CSV Files in R:
# Load the CSV files into R
usage <- read.csv("../starCAT_usage.csv", row.names = 1)
scores <- read.csv("../starCAT_scores.csv", row.names = 1)
4. Convert to a DataFrame or Matrix to Add to Seurat:
seurat_obj <- All_samples_Merged
rm(All_samples_Merged)
# Assuming you have a Seurat object called seurat_obj
# Add the scores to the Seurat object metadata
# Add each score column as a metadata variable
seurat_obj$Proliferation <- scores$Proliferation
seurat_obj$ASA <- scores$ASA
# Check if they are added correctly
head(seurat_obj@meta.data)
# Add the usage columns to the metadata
seurat_obj$usage_CellCycle_G2M <- usage$CellCycle.G2M
seurat_obj$usage_Translation <- usage$Translation
Visualization Seurat
head(rownames(usage))
[1] "L1_AAACCTGAGGGCTTCC-1" "L1_AAACCTGGTGCAGGTA-1" "L1_AAACCTGGTTAAAGTG-1" "L1_AAACCTGTCAGGTAAA-1"
[5] "L1_AAACCTGTCCCTGACT-1" "L1_AAACCTGTCCTTCAAT-1"
head(Cells(seurat_obj))
[1] "L1_AAACCTGAGGGCTTCC-1" "L1_AAACCTGGTGCAGGTA-1" "L1_AAACCTGGTTAAAGTG-1" "L1_AAACCTGTCAGGTAAA-1"
[5] "L1_AAACCTGTCCCTGACT-1" "L1_AAACCTGTCCTTCAAT-1"
Visualization Seurat
sum(rownames(usage) %in% Cells(seurat_obj))
[1] 49305
sum(rownames(scores) %in% Cells(seurat_obj))
[1] 49305
6. Visualize in Seurat
DimPlot(seurat_obj, reduction = "umap", group.by = "Multinomial_Label", label = TRUE, repel = T, label.box = T)

Visualization scPubr
table(seurat_obj$cell_line, seurat_obj$Multinomial_Label)
CD4_CM CD4_EM CD4_Naive CD8_CM CD8_EM CD8_Naive CD8_TEMRA gdT MAIT Treg
L1 701 1746 514 1430 218 914 41 155 103 3
L2 0 25 300 294 78 2372 1715 1143 7 1
L3 2227 1149 571 2103 44 31 9 11 12 271
L4 2702 1623 300 930 15 7 11 5 2 411
L5 2330 1119 352 1992 4 9 5 9 2 200
L6 817 2705 40 860 189 1 29 22 37 448
L7 1836 2693 29 572 4 2 5 0 11 179
CD4Tcells_lab 1510 741 2021 110 30 401 12 49 74 158
CD4Tcells_10x 466 346 2062 33 19 384 12 32 86 64
table(seurat_obj$seurat_clusters, seurat_obj$Multinomial_Label)
CD4_CM CD4_EM CD4_Naive CD8_CM CD8_EM CD8_Naive CD8_TEMRA gdT MAIT Treg
0 2305 2443 101 1636 75 11 11 8 16 183
1 22 45 245 222 47 2137 1544 1004 5 4
2 1679 969 459 1338 25 48 5 12 12 116
3 330 33 3587 11 4 631 5 19 5 36
4 1769 762 219 1262 1 1 1 5 1 65
5 661 781 558 791 109 429 29 128 31 117
6 1401 503 200 1242 13 22 2 2 4 147
7 419 1993 63 381 74 118 62 54 6 239
8 1583 1049 105 370 6 2 2 0 0 221
9 369 956 320 566 105 595 129 121 67 45
10 1449 1016 187 112 36 51 20 49 140 152
11 45 1033 17 151 67 65 18 12 38 229
12 307 418 82 92 29 6 9 8 9 103
13 250 146 46 150 10 5 2 4 0 78
Visualization scPubr
library(SCpubr)
SCpubr::do_DimPlot(seurat_obj, group.by = "Multinomial_Label",label = TRUE, repel = T, label.box = T, legend.position = "right")

Visualize in Seurat
FeaturePlot(seurat_obj, features = c("Translation", "ISG", "CellCycle.S"))

Visualize in Seurat
VlnPlot(seurat_obj, features = c("Proliferation", "ASA"), group.by = "seurat_clusters")

Visualize in Seurat
FeaturePlot(seurat_obj, features = c("Translation", "ISG", "CellCycle.S"))

Visualize in Seurat
FeaturePlot(seurat_obj, "HLA")

Visualize in Seurat
# Visualize main annotation
DimPlot(seurat_obj, group.by = "Multinomial_Label", label = TRUE) +
ggtitle("TCAT-predicted cell types")

# Overlay functional binary states
DimPlot(seurat_obj, group.by = "ASA_binary") + ggtitle("Active vs Resting cells")

DimPlot(seurat_obj, group.by = "Proliferation_binary") + ggtitle("Proliferative vs Quiescent cells")

# Quantitative gradients
FeaturePlot(seurat_obj, features = c("ASA", "Proliferation"))

# Pathway-level modules
FeaturePlot(seurat_obj, features = c("Translation", "ISG", "CellCycle.S"))

NA
NA
LS0tCnRpdGxlOiAiVENBVDogVENlbGxBdGxhdHMiCmF1dGhvcjogIk5hc2lyIE1haG1vb2QgQWJiYXNpIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIGRmX3ByaW50OiBwYWdlZAogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQoKCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgTG9hZCBiZWxvdyBsaWJyYXJpZXMKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwbG90bHkpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCgoKbGlicmFyeShTQ3B1YnIpCmxpYnJhcnkoZHBseXIpCmBgYAoKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7cn0KCkFsbF9zYW1wbGVzX01lcmdlZCA8LSByZWFkUkRTKCIuLi8uLi8wLVNldXJhdF9SRFNfT0JKRUNUX0ZJTkFML1NldXJhdF9vYmplY3RfRmluYWxfY2hhbmdlcy9BbGxfc2FtcGxlc19NZXJnZWRfd2l0aF9TVENBVF9Bbm5vdGF0aW9uX2ZpbmFsLTUtMDktMjAyNS5yZHMiKQoKCgpgYGAKCiMgMy4gTG9hZCB0aGUgQ1NWIEZpbGVzIGluIFI6CmBgYHtyfQoKIyBMb2FkIHRoZSBDU1YgZmlsZXMgaW50byBSCnVzYWdlIDwtIHJlYWQuY3N2KCIuLi9zdGFyQ0FUX3VzYWdlLmNzdiIsIHJvdy5uYW1lcyA9IDEpCnNjb3JlcyA8LSByZWFkLmNzdigiLi4vc3RhckNBVF9zY29yZXMuY3N2Iiwgcm93Lm5hbWVzID0gMSkKCgpgYGAKCgojIDQuIENvbnZlcnQgdG8gYSBEYXRhRnJhbWUgb3IgTWF0cml4IHRvIEFkZCB0byBTZXVyYXQ6CmBgYHtyfQoKc2V1cmF0X29iaiA8LSBBbGxfc2FtcGxlc19NZXJnZWQKCnJtKEFsbF9zYW1wbGVzX01lcmdlZCkKCiMgQXNzdW1pbmcgeW91IGhhdmUgYSBTZXVyYXQgb2JqZWN0IGNhbGxlZCBzZXVyYXRfb2JqCiMgQWRkIHRoZSBzY29yZXMgdG8gdGhlIFNldXJhdCBvYmplY3QgbWV0YWRhdGEKCiMgQWRkIGVhY2ggc2NvcmUgY29sdW1uIGFzIGEgbWV0YWRhdGEgdmFyaWFibGUKc2V1cmF0X29iaiRQcm9saWZlcmF0aW9uIDwtIHNjb3JlcyRQcm9saWZlcmF0aW9uCnNldXJhdF9vYmokQVNBIDwtIHNjb3JlcyRBU0EKCiMgQ2hlY2sgaWYgdGhleSBhcmUgYWRkZWQgY29ycmVjdGx5CmhlYWQoc2V1cmF0X29iakBtZXRhLmRhdGEpCgoKIyBBZGQgdGhlIHVzYWdlIGNvbHVtbnMgdG8gdGhlIG1ldGFkYXRhCnNldXJhdF9vYmokdXNhZ2VfQ2VsbEN5Y2xlX0cyTSA8LSB1c2FnZSRDZWxsQ3ljbGUuRzJNCnNldXJhdF9vYmokdXNhZ2VfVHJhbnNsYXRpb24gPC0gdXNhZ2UkVHJhbnNsYXRpb24KCgoKYGBgCgoKCgojIyBWaXN1YWxpemF0aW9uIFNldXJhdApgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgoKaGVhZChyb3duYW1lcyh1c2FnZSkpCmhlYWQoQ2VsbHMoc2V1cmF0X29iaikpCgoKYGBgCiMjIFZpc3VhbGl6YXRpb24gU2V1cmF0CmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCnN1bShyb3duYW1lcyh1c2FnZSkgJWluJSBDZWxscyhzZXVyYXRfb2JqKSkKc3VtKHJvd25hbWVzKHNjb3JlcykgJWluJSBDZWxscyhzZXVyYXRfb2JqKSkKCmBgYAoKCiMgNS4gQWRkIFRDQVQgT3V0cHV0cyB0byBTZXVyYXQgTWV0YWRhdGEKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKIyBBZGQgdXNhZ2UgYW5kIHNjb3JlcwpzZXVyYXRfb2JqIDwtIEFkZE1ldGFEYXRhKHNldXJhdF9vYmosIG1ldGFkYXRhID0gdXNhZ2UpCnNldXJhdF9vYmogPC0gQWRkTWV0YURhdGEoc2V1cmF0X29iaiwgbWV0YWRhdGEgPSBzY29yZXMpCgojIENvbmZpcm0gbmV3IG1ldGFkYXRhIGNvbHVtbnMKY29sbmFtZXMoc2V1cmF0X29iakBtZXRhLmRhdGEpCgoKYGBgCiMjIFZpc3VhbGl6YXRpb24gc2NQdWJyCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCmxpYnJhcnkoU0NwdWJyKQoKU0NwdWJyOjpkb19EaW1QbG90KHNldXJhdF9vYmosIGdyb3VwLmJ5ID0gIlByZWRpY3Rpb24iLGxhYmVsID0gVFJVRSwgcmVwZWwgPSBULCBsYWJlbC5ib3ggPSBULCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQoKYGBgCgojIDYuIFZpc3VhbGl6ZSBpbiBTZXVyYXQKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpEaW1QbG90KHNldXJhdF9vYmosIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiTXVsdGlub21pYWxfTGFiZWwiLCBsYWJlbCA9IFRSVUUsIHJlcGVsID0gVCwgbGFiZWwuYm94ID0gVCkKCmBgYAoKIyMgVmlzdWFsaXphdGlvbiBzY1B1YnIKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKdGFibGUoc2V1cmF0X29iaiRjZWxsX2xpbmUsIHNldXJhdF9vYmokTXVsdGlub21pYWxfTGFiZWwpCgp0YWJsZShzZXVyYXRfb2JqJHNldXJhdF9jbHVzdGVycywgc2V1cmF0X29iaiRNdWx0aW5vbWlhbF9MYWJlbCkKCmBgYAoKCgoKCiMjIFZpc3VhbGl6YXRpb24gc2NQdWJyCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCmxpYnJhcnkoU0NwdWJyKQoKU0NwdWJyOjpkb19EaW1QbG90KHNldXJhdF9vYmosIGdyb3VwLmJ5ID0gIk11bHRpbm9taWFsX0xhYmVsIixsYWJlbCA9IFRSVUUsIHJlcGVsID0gVCwgbGFiZWwuYm94ID0gVCwgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKCmBgYAoKCiMjIFZpc3VhbGl6ZSBpbiBTZXVyYXQKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChzZXVyYXRfb2JqLCBmZWF0dXJlcyA9IGMoIlRyYW5zbGF0aW9uIiwgIklTRyIsICJDZWxsQ3ljbGUuUyIpKQoKYGBgCgoKCgoKCgoKIyMgVmlzdWFsaXplIGluIFNldXJhdApgYGB7ciwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9ClZsblBsb3Qoc2V1cmF0X29iaiwgZmVhdHVyZXMgPSBjKCJQcm9saWZlcmF0aW9uIiwgIkFTQSIpLCBncm91cC5ieSA9ICJzZXVyYXRfY2x1c3RlcnMiKQoKYGBgCgoKCgoKCiMjIFZpc3VhbGl6ZSBpbiBTZXVyYXQKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChzZXVyYXRfb2JqLCBmZWF0dXJlcyA9IGMoIlRyYW5zbGF0aW9uIiwgIklTRyIsICJDZWxsQ3ljbGUuUyIpKQoKYGBgCgoKCgoKCiMjIFZpc3VhbGl6ZSBpbiBTZXVyYXQKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQpGZWF0dXJlUGxvdChzZXVyYXRfb2JqLCAiSExBIikKCmBgYAoKCiMjIFZpc3VhbGl6ZSBpbiBTZXVyYXQKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQojIFZpc3VhbGl6ZSBtYWluIGFubm90YXRpb24KRGltUGxvdChzZXVyYXRfb2JqLCBncm91cC5ieSA9ICJNdWx0aW5vbWlhbF9MYWJlbCIsIGxhYmVsID0gVFJVRSkgKwogIGdndGl0bGUoIlRDQVQtcHJlZGljdGVkIGNlbGwgdHlwZXMiKQoKIyBPdmVybGF5IGZ1bmN0aW9uYWwgYmluYXJ5IHN0YXRlcwpEaW1QbG90KHNldXJhdF9vYmosIGdyb3VwLmJ5ID0gIkFTQV9iaW5hcnkiKSArIGdndGl0bGUoIkFjdGl2ZSB2cyBSZXN0aW5nIGNlbGxzIikKRGltUGxvdChzZXVyYXRfb2JqLCBncm91cC5ieSA9ICJQcm9saWZlcmF0aW9uX2JpbmFyeSIpICsgZ2d0aXRsZSgiUHJvbGlmZXJhdGl2ZSB2cyBRdWllc2NlbnQgY2VsbHMiKQoKIyBRdWFudGl0YXRpdmUgZ3JhZGllbnRzCkZlYXR1cmVQbG90KHNldXJhdF9vYmosIGZlYXR1cmVzID0gYygiQVNBIiwgIlByb2xpZmVyYXRpb24iKSkKCiMgUGF0aHdheS1sZXZlbCBtb2R1bGVzCkZlYXR1cmVQbG90KHNldXJhdF9vYmosIGZlYXR1cmVzID0gYygiVHJhbnNsYXRpb24iLCAiSVNHIiwgIkNlbGxDeWNsZS5TIikpCgoKYGBgCgoKCgo=