load libraries————————————

1. Load and Subset Normal CD4 T Cells


All_samples_Merged <- readRDS("../All_samples_Merged_Benchmarked_05-11-2025.rds")

Idents(All_samples_Merged) <- "seurat_clusters"
table(All_samples_Merged@active.ident)

   0    1    2    3    4    5    6    7    8    9   10   11   12   13 
6789 5275 4663 4661 4086 3634 3536 3409 3338 3273 3212 1675 1063  691 

2. Create the annotation summary table


library(dplyr)
library(tidyr)
library(purrr)

methods <- c(
  "predicted.id",             #scPred
  "predicted.celltype.l2",    # Azimuth (l2 prediction)
  "singler.immune",           # Example of other annotation methods like SingleR
  "Prediction",               #STCAT
  "scATOMIC_annotation"      #scATOMIC
  )

annotation_summary <- map_dfr(methods, function(m) {
  df <- All_samples_Merged@meta.data
  df %>%
    group_by(seurat_clusters, label = .data[[m]]) %>%
    summarise(n = n(), .groups = "drop") %>%
    group_by(seurat_clusters) %>%
    slice_max(n, n = 1, with_ties = FALSE) %>%
    mutate(method = m)
})



# Set the order of methods
annotation_summary$method <- factor(annotation_summary$method, levels = methods)

head(annotation_summary)
# Should show columns: seurat_clusters | label | n | method

3. Convert to matrix format for plotting

library(tidyr)
library(ggplot2)

annotation_matrix <- annotation_summary %>%
  select(method, seurat_clusters, label) %>%
  pivot_wider(names_from = seurat_clusters, values_from = label)

# Rename methods for the plot
annotation_summary <- annotation_summary %>%
  mutate(method = recode(method,
                         "predicted.id" = "scPred",
                         "predicted.celltype.l2" = "Azimuth.l2",
                         "singler.immune" = "SingleR(Immune)",
                         "Prediction" = "STCAT",
                         "scATOMIC_annotation" = "scATOMIC"))

# Save the annotation summary table to a CSV file for further analysis

write.csv(annotation_summary, "annotation_summary_table.csv", row.names = FALSE)
LS0tCnRpdGxlOiAiQmVuY2htYXJrIGNlbGwgUHJlZGljdGlvbiBNZXRob2RzLTUtMDEyLTIwMjUgb24gQ2x1c3RlcnMiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKCiMjIGxvYWQgbGlicmFyaWVzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKICAgIGxpYnJhcnkoU2V1cmF0KQogICAgbGlicmFyeShkcGx5cikKICAgIGxpYnJhcnkocGF0Y2h3b3JrKQogICAgbGlicmFyeShnZ3Bsb3QyKQogICAgbGlicmFyeShwaGVhdG1hcCkKICAgIGxpYnJhcnkoc2NQcmVkKQogICAgbGlicmFyeShjZWxsZGV4KQogICAgbGlicmFyeShTaW5nbGVSKQogICAgbGlicmFyeShyZW1vdGVzKQogICAgbGlicmFyeShwcmVzdG8pCiAgICBsaWJyYXJ5KFNldXJhdERpc2spCiAgICBsaWJyYXJ5KFNldXJhdERhdGEpCiAgICBsaWJyYXJ5KEF6aW11dGgpCgpgYGAKCgoKCiMgMS4gTG9hZCBhbmQgU3Vic2V0IE5vcm1hbCBDRDQgVCBDZWxscwpgYGB7ciBsb2FkU2V1cmF0fQoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIHJlYWRSRFMoIi4uL0FsbF9zYW1wbGVzX01lcmdlZF9CZW5jaG1hcmtlZF8wNS0xMS0yMDI1LnJkcyIpCgpJZGVudHMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSAic2V1cmF0X2NsdXN0ZXJzIgp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWRAYWN0aXZlLmlkZW50KQoKYGBgCgoKCiMgMi4gQ3JlYXRlIHRoZSBhbm5vdGF0aW9uIHN1bW1hcnkgdGFibGUKYGBge3J9CgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHB1cnJyKQoKbWV0aG9kcyA8LSBjKAogICJwcmVkaWN0ZWQuaWQiLCAgICAgICAgICAgICAjc2NQcmVkCiAgInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsICAgICMgQXppbXV0aCAobDIgcHJlZGljdGlvbikKICAic2luZ2xlci5pbW11bmUiLCAgICAgICAgICAgIyBFeGFtcGxlIG9mIG90aGVyIGFubm90YXRpb24gbWV0aG9kcyBsaWtlIFNpbmdsZVIKICAiUHJlZGljdGlvbiIsICAgICAgICAgICAgICAgI1NUQ0FUCiAgInNjQVRPTUlDX2Fubm90YXRpb24iICAgICAgI3NjQVRPTUlDCiAgKQoKYW5ub3RhdGlvbl9zdW1tYXJ5IDwtIG1hcF9kZnIobWV0aG9kcywgZnVuY3Rpb24obSkgewogIGRmIDwtIEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEKICBkZiAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycywgbGFiZWwgPSAuZGF0YVtbbV1dKSAlPiUKICAgIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycykgJT4lCiAgICBzbGljZV9tYXgobiwgbiA9IDEsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUKICAgIG11dGF0ZShtZXRob2QgPSBtKQp9KQoKCgojIFNldCB0aGUgb3JkZXIgb2YgbWV0aG9kcwphbm5vdGF0aW9uX3N1bW1hcnkkbWV0aG9kIDwtIGZhY3Rvcihhbm5vdGF0aW9uX3N1bW1hcnkkbWV0aG9kLCBsZXZlbHMgPSBtZXRob2RzKQoKaGVhZChhbm5vdGF0aW9uX3N1bW1hcnkpCiMgU2hvdWxkIHNob3cgY29sdW1uczogc2V1cmF0X2NsdXN0ZXJzIHwgbGFiZWwgfCBuIHwgbWV0aG9kCmBgYAoKCiMgMy4gQ29udmVydCB0byBtYXRyaXggZm9ybWF0IGZvciBwbG90dGluZwpgYGB7cn0KbGlicmFyeSh0aWR5cikKbGlicmFyeShnZ3Bsb3QyKQoKYW5ub3RhdGlvbl9tYXRyaXggPC0gYW5ub3RhdGlvbl9zdW1tYXJ5ICU+JQogIHNlbGVjdChtZXRob2QsIHNldXJhdF9jbHVzdGVycywgbGFiZWwpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzZXVyYXRfY2x1c3RlcnMsIHZhbHVlc19mcm9tID0gbGFiZWwpCgojIFJlbmFtZSBtZXRob2RzIGZvciB0aGUgcGxvdAphbm5vdGF0aW9uX3N1bW1hcnkgPC0gYW5ub3RhdGlvbl9zdW1tYXJ5ICU+JQogIG11dGF0ZShtZXRob2QgPSByZWNvZGUobWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgInByZWRpY3RlZC5pZCIgPSAic2NQcmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiID0gIkF6aW11dGgubDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZXIuaW1tdW5lIiA9ICJTaW5nbGVSKEltbXVuZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIlByZWRpY3Rpb24iID0gIlNUQ0FUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJzY0FUT01JQ19hbm5vdGF0aW9uIiA9ICJzY0FUT01JQyIpKQoKIyBTYXZlIHRoZSBhbm5vdGF0aW9uIHN1bW1hcnkgdGFibGUgdG8gYSBDU1YgZmlsZSBmb3IgZnVydGhlciBhbmFseXNpcwoKd3JpdGUuY3N2KGFubm90YXRpb25fc3VtbWFyeSwgImFubm90YXRpb25fc3VtbWFyeV90YWJsZS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCgpgYGAKCgoK