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

5. Add TCAT Outputs to Seurat Metadata


# Add usage and scores
seurat_obj <- AddMetaData(seurat_obj, metadata = usage)
seurat_obj <- AddMetaData(seurat_obj, metadata = scores)

# Confirm new metadata columns
colnames(seurat_obj@meta.data)
  [1] "orig.ident"                         "nCount_RNA"                         "nFeature_RNA"                      
  [4] "nCount_ADT"                         "nFeature_ADT"                       "nUMI"                              
  [7] "ngene"                              "cell_line"                          "Patient_origin"                    
 [10] "Patient_Immunophenotype"            "condition_of_amplification_in_vivo" "culture_medium"                    
 [13] "Stromal_cells"                      "Cell_line_Immunophenotype"          "TP53_mutation"                     
 [16] "age_at_diagnosis"                   "stage_diagnosis"                    "stage_analysis"                    
 [19] "Treatments_analysis"                "TCRVB2"                             "CD3_M"                             
 [22] "CD30_M"                             "CCR4_M"                             "CD162_BL"                          
 [25] "CD26_BL"                            "CD7_M"                              "CLA_BD"                            
 [28] "CD4_BD"                             "CCR7_M"                             "CD45RO_BD"                         
 [31] "CD45RA_BD"                          "CellName"                           "percent.mt"                        
 [34] "CD26_BD"                            "CD45RA_M"                           "predicted.celltype.l1.score"       
 [37] "predicted.celltype.l1"              "predicted.celltype.l2.score"        "predicted.celltype.l2"             
 [40] "predicted.celltype.l3.score"        "predicted.celltype.l3"              "mapping.score"                     
 [43] "percent.rb"                         "nCount_SCT"                         "nFeature_SCT"                      
 [46] "S.Score"                            "G2M.Score"                          "Phase"                             
 [49] "old.ident"                          "CC.Difference"                      "SCT_snn_res.0.4"                   
 [52] "SCT_snn_res.0.5"                    "SCT_snn_res.0.6"                    "SCT_snn_res.0.7"                   
 [55] "SCT_snn_res.0.8"                    "seurat_clusters"                    "harmony_res_0.1"                   
 [58] "harmony_res_0.2"                    "harmony_res_0.3"                    "harmony_res_0.4"                   
 [61] "harmony_res_0.5"                    "harmony_res_0.6"                    "harmony_res_0.7"                   
 [64] "harmony_res_0.8"                    "harmony_res_0.9"                    "harmony_res_1"                     
 [67] "harmony_res_1.2"                    "predicted.celltype.l1_backup"       "predicted.celltype.l2_backup"      
 [70] "predicted.celltype.l3_backup"       "Prediction"                         "Cluster"                           
 [73] "Uncertainty_score"                  "Condition"                          "Proliferation"                     
 [76] "ASA"                                "usage_CellCycle_G2M"                "usage_Translation"                 
 [79] "CellCycle.G2M"                      "Translation"                        "HLA"                               
 [82] "ISG"                                "Mito"                               "Doublet.RBC"                       
 [85] "gdT"                                "CellCycle.S"                        "Cytotoxic"                         
 [88] "Doublet.Platelet"                   "NME1.FABP5"                         "Th22"                              
 [91] "MAIT"                               "CellCycle.Late.S"                   "Cytoskeleton"                      
 [94] "Heatshock"                          "Multi.Cytokine"                     "TEMRA"                             
 [97] "Doublet.Myeloid"                    "Metallothionein"                    "CD4.CM"                            
[100] "IEG"                                "CD8.EM"                             "IEG2"                              
[103] "CD4.Naive"                          "Treg"                               "Th17.Resting"                      
[106] "Poor.Quality"                       "CD8.Naive"                          "RGCC.MYADM"                        
[109] "TIMD4.TIM3"                         "Doublet.Plasmablast"                "BCL2.FAM13A"                       
[112] "IL10.IL19"                          "Th2.Activated"                      "Th2.Resting"                       
[115] "ICOS.CD38"                          "Doublet.Bcell"                      "Th1.Like"                          
[118] "CTLA4.CD38"                         "CD8.Trm"                            "Th17.Activated"                    
[121] "Tfh.2"                              "OX40.EBI3"                          "CD172a.MERTK"                      
[124] "IEG3"                               "Doublet.Fibroblast"                 "SOX4.TOX2"                         
[127] "CD40LG.TXNIP"                       "Tph"                                "Exhaustion"                        
[130] "Tfh.1"                              "ASA_binary"                         "Proliferation_binary"              
[133] "Multinomial_Label"                 

Visualization scPubr


library(SCpubr)

SCpubr::do_DimPlot(seurat_obj, group.by = "Prediction",label = TRUE, repel = T, label.box = T, legend.position = "right")

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=