0.1 load libraries————————————

1 Load RDS with all annotations


# Load main object with all annotations
All_samples_Merged <- readRDS("/home/bioinfo/1-Thesis_Final_Year_2025/2025-Year3_Analysis/1-scRNA_RESULTS-19-11-2025/17-Herrera_DATA_CELL_Annotation/All_samples_Herrera_with_all_annotations_ATLAS-Herrera-03-02-2026.rds")

# Load scATOMIC object
scATOMIC_obj <- readRDS("/home/bioinfo/1-Thesis_Final_Year_2025/2025-Year3_Analysis/1-scRNA_RESULTS-19-11-2025/17-Herrera_DATA_CELL_Annotation/All_samples_Herrera_scATOMIC_Herrera_04-02-2026.rds")

Idents(All_samples_Merged) <- "seurat_clusters"
cat("Clusters in All_samples_Merged:\n")
Clusters in All_samples_Merged:
print(table(All_samples_Merged@active.ident))

   2    3    0   12    6   17    5    4    1   15   14   18    9   13    7    8   11   16   10 
3241 1006  185  124  404   44  223 2278   92   48  183   10   84  150  230  923  727    4  829 

1.1 Check metadata columns

cat("\nscATOMIC_obj metadata columns:\n")

scATOMIC_obj metadata columns:
print(colnames(scATOMIC_obj@meta.data))
 [1] "orig.ident"      "nCount_RNA"      "nFeature_RNA"    "sample_id"       "condition"       "tissue"         
 [7] "percent.mt"      "RNA_snn_res.0.5" "seurat_clusters" "RNA_snn_res.0.2" "DE_group"        "clonotype"      
[13] "TCR_alpha"       "TCR_beta"        "tissue_group"    "scATOMIC_pred"  

1.2 Check metadata columns

## Transfer scATOMIC labels to main object

# Transfer scATOMIC predictions
All_samples_Merged$scATOMIC_annotation <- scATOMIC_obj@meta.data[colnames(All_samples_Merged), "scATOMIC_pred"]

# Verify transfer
cat("\nTransferred scATOMIC annotations:\n")

Transferred scATOMIC annotations:
print(table(All_samples_Merged$scATOMIC_annotation, useNA = "always"))

                                       Any Cell                                          B Cell 
                                             12                                             362 
                                     Blood Cell                                   CD14 Monocyte 
                                             63                                             885 
                                  CD16 Monocyte                               CD4 or CD8 T cell 
                                             88                                              99 
                                    CD4+ T cell                                CD8 T or NK cell 
                                            581                                              70 
                                    CD8+ T cell                                            cDC1 
                                             71                                               3 
                                           cDC2                                  Dendritic Cell 
                                            120                                               1 
                   Effector/Memory CD4+ T cells                    Effector/Memory CD8+ T cells 
                                           1455                                            1354 
                         Exhausted CD8+ T cells                                            HSPC 
                                              5                                              13 
                   Macrophage or Dendritic Cell                                      MAIT cells 
                                             27                                             159 
                                       Monocyte                              Naive CD4+ T cells 
                                             18                                            3992 
                             Naive CD8+ T cells                             Natural killer cell 
                                            745                                             328 
                                            pDC                                     Plasmablast 
                                             22                                               3 
                                   T or NK Cell                              T regulatory cells 
                                              3                                              64 
Terminally differentiated effector CD4+ T cells                     Tfh/Th1 helper CD4+ T cells 
                                              1                                             208 
                                           <NA> 
                                             33 
# Check coverage
cat("\nCells with scATOMIC annotation:", sum(!is.na(All_samples_Merged$scATOMIC_annotation)), "\n")

Cells with scATOMIC annotation: 10752 
cat("Total cells:", ncol(All_samples_Merged), "\n")
Total cells: 10785 
cat("Coverage:", round(sum(!is.na(All_samples_Merged$scATOMIC_annotation))/ncol(All_samples_Merged)*100, 2), "%\n")
Coverage: 99.69 %
# Verify the column was added
cat("\nNew column added to metadata:\n")

New column added to metadata:
cat("scATOMIC_annotation:", "scATOMIC_annotation" %in% colnames(All_samples_Merged@meta.data), "\n")
scATOMIC_annotation: TRUE 

2 Create annotation summary table

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

# Define annotation methods (removed STCAT)
methods <- c(
  "predicted.id",             # scPred
  "predicted.celltype.l2",    # Azimuth (l2 prediction)
  "singler.immune",           # SingleR
  "scATOMIC_annotation"       # scATOMIC
)

# Create summary - most common label per cluster for each method
annotation_summary <- map_dfr(methods, function(m) {
  df <- All_samples_Merged@meta.data
  df %>%
    filter(!is.na(.data[[m]])) %>%
    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 method order
annotation_summary$method <- factor(annotation_summary$method, levels = methods)

head(annotation_summary)

# Save annotation summary table
#write.csv(annotation_summary, "annotation_summary_Herrera_with_scATOMIC_04-02-2026.csv", row.names = FALSE)

3 Save RDS


## Save updated object with scATOMIC annotations

# saveRDS(All_samples_Merged, 
#         file = "/home/bioinfo/1-Thesis_Final_Year_2025/2025-Year3_Analysis/1-scRNA_RESULTS-19-11-2025/17-Herrera_DATA_CELL_Annotation/All_samples_Herrera_with_scATOMIC_04-02-2026.rds")

cat("\n✓ Saved updated object with scATOMIC annotations!\n")

✓ Saved updated object with scATOMIC annotations!
cat("File: All_samples_Herrera_with_scATOMIC_04-02-2026.rds\n")
File: All_samples_Herrera_with_scATOMIC_04-02-2026.rds
cat("Location: 17-Herrera_DATA_CELL_Annotation/\n")
Location: 17-Herrera_DATA_CELL_Annotation/
cat("Ready for Cross-Method Annotation Comparison!\n")
Ready for Cross-Method Annotation Comparison!
LS0tCnRpdGxlOiAiMy1UcmFuc2ZlciBzY0FUT01JQyBhbmQgQ3Jvc3MtTWV0aG9kIEFubm90YXRpb24gQ29tcGFyaXNvbiBUYWJsZSAtIEhlcnJlcmEgRGF0YXNldCIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB0cnVlCiAgICB0aGVtZTogam91cm5hbAotLS0KCgojIyBsb2FkIGxpYnJhcmllcy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCiAgICBsaWJyYXJ5KFNldXJhdCkKICAgIGxpYnJhcnkoZHBseXIpCiAgICBsaWJyYXJ5KHBhdGNod29yaykKICAgIGxpYnJhcnkoZ2dwbG90MikKICAgIGxpYnJhcnkocGhlYXRtYXApCiAgICBsaWJyYXJ5KHNjUHJlZCkKICAgIGxpYnJhcnkoY2VsbGRleCkKICAgIGxpYnJhcnkoU2luZ2xlUikKICAgIGxpYnJhcnkocmVtb3RlcykKICAgIGxpYnJhcnkocHJlc3RvKQogICAgbGlicmFyeShTZXVyYXREaXNrKQogICAgbGlicmFyeShTZXVyYXREYXRhKQogICAgbGlicmFyeShBemltdXRoKQoKYGBgCgoKCgojIExvYWQgUkRTIHdpdGggYWxsIGFubm90YXRpb25zCmBgYHtyfQoKIyBMb2FkIG1haW4gb2JqZWN0IHdpdGggYWxsIGFubm90YXRpb25zCkFsbF9zYW1wbGVzX01lcmdlZCA8LSByZWFkUkRTKCIvaG9tZS9iaW9pbmZvLzEtVGhlc2lzX0ZpbmFsX1llYXJfMjAyNS8yMDI1LVllYXIzX0FuYWx5c2lzLzEtc2NSTkFfUkVTVUxUUy0xOS0xMS0yMDI1LzE3LUhlcnJlcmFfREFUQV9DRUxMX0Fubm90YXRpb24vQWxsX3NhbXBsZXNfSGVycmVyYV93aXRoX2FsbF9hbm5vdGF0aW9uc19BVExBUy1IZXJyZXJhLTAzLTAyLTIwMjYucmRzIikKCiMgTG9hZCBzY0FUT01JQyBvYmplY3QKc2NBVE9NSUNfb2JqIDwtIHJlYWRSRFMoIi9ob21lL2Jpb2luZm8vMS1UaGVzaXNfRmluYWxfWWVhcl8yMDI1LzIwMjUtWWVhcjNfQW5hbHlzaXMvMS1zY1JOQV9SRVNVTFRTLTE5LTExLTIwMjUvMTctSGVycmVyYV9EQVRBX0NFTExfQW5ub3RhdGlvbi9BbGxfc2FtcGxlc19IZXJyZXJhX3NjQVRPTUlDX0hlcnJlcmFfMDQtMDItMjAyNi5yZHMiKQoKSWRlbnRzKEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gInNldXJhdF9jbHVzdGVycyIKY2F0KCJDbHVzdGVycyBpbiBBbGxfc2FtcGxlc19NZXJnZWQ6XG4iKQpwcmludCh0YWJsZShBbGxfc2FtcGxlc19NZXJnZWRAYWN0aXZlLmlkZW50KSkKCgpgYGAKCiMjIENoZWNrIG1ldGFkYXRhIGNvbHVtbnMKCmBgYHtyIH0KY2F0KCJcbnNjQVRPTUlDX29iaiBtZXRhZGF0YSBjb2x1bW5zOlxuIikKcHJpbnQoY29sbmFtZXMoc2NBVE9NSUNfb2JqQG1ldGEuZGF0YSkpCgpgYGAKIyMgQ2hlY2sgbWV0YWRhdGEgY29sdW1ucwpgYGB7ciB9CiMjIFRyYW5zZmVyIHNjQVRPTUlDIGxhYmVscyB0byBtYWluIG9iamVjdAoKIyBUcmFuc2ZlciBzY0FUT01JQyBwcmVkaWN0aW9ucwpBbGxfc2FtcGxlc19NZXJnZWQkc2NBVE9NSUNfYW5ub3RhdGlvbiA8LSBzY0FUT01JQ19vYmpAbWV0YS5kYXRhW2NvbG5hbWVzKEFsbF9zYW1wbGVzX01lcmdlZCksICJzY0FUT01JQ19wcmVkIl0KCiMgVmVyaWZ5IHRyYW5zZmVyCmNhdCgiXG5UcmFuc2ZlcnJlZCBzY0FUT01JQyBhbm5vdGF0aW9uczpcbiIpCnByaW50KHRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRzY0FUT01JQ19hbm5vdGF0aW9uLCB1c2VOQSA9ICJhbHdheXMiKSkKCiMgQ2hlY2sgY292ZXJhZ2UKY2F0KCJcbkNlbGxzIHdpdGggc2NBVE9NSUMgYW5ub3RhdGlvbjoiLCBzdW0oIWlzLm5hKEFsbF9zYW1wbGVzX01lcmdlZCRzY0FUT01JQ19hbm5vdGF0aW9uKSksICJcbiIpCmNhdCgiVG90YWwgY2VsbHM6IiwgbmNvbChBbGxfc2FtcGxlc19NZXJnZWQpLCAiXG4iKQpjYXQoIkNvdmVyYWdlOiIsIHJvdW5kKHN1bSghaXMubmEoQWxsX3NhbXBsZXNfTWVyZ2VkJHNjQVRPTUlDX2Fubm90YXRpb24pKS9uY29sKEFsbF9zYW1wbGVzX01lcmdlZCkqMTAwLCAyKSwgIiVcbiIpCgojIFZlcmlmeSB0aGUgY29sdW1uIHdhcyBhZGRlZApjYXQoIlxuTmV3IGNvbHVtbiBhZGRlZCB0byBtZXRhZGF0YTpcbiIpCmNhdCgic2NBVE9NSUNfYW5ub3RhdGlvbjoiLCAic2NBVE9NSUNfYW5ub3RhdGlvbiIgJWluJSBjb2xuYW1lcyhBbGxfc2FtcGxlc19NZXJnZWRAbWV0YS5kYXRhKSwgIlxuIikKCgpgYGAKIyBDcmVhdGUgYW5ub3RhdGlvbiBzdW1tYXJ5IHRhYmxlCmBgYHtyIH0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShwdXJycikKCiMgRGVmaW5lIGFubm90YXRpb24gbWV0aG9kcyAocmVtb3ZlZCBTVENBVCkKbWV0aG9kcyA8LSBjKAogICJwcmVkaWN0ZWQuaWQiLCAgICAgICAgICAgICAjIHNjUHJlZAogICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLCAgICAjIEF6aW11dGggKGwyIHByZWRpY3Rpb24pCiAgInNpbmdsZXIuaW1tdW5lIiwgICAgICAgICAgICMgU2luZ2xlUgogICJzY0FUT01JQ19hbm5vdGF0aW9uIiAgICAgICAjIHNjQVRPTUlDCikKCiMgQ3JlYXRlIHN1bW1hcnkgLSBtb3N0IGNvbW1vbiBsYWJlbCBwZXIgY2x1c3RlciBmb3IgZWFjaCBtZXRob2QKYW5ub3RhdGlvbl9zdW1tYXJ5IDwtIG1hcF9kZnIobWV0aG9kcywgZnVuY3Rpb24obSkgewogIGRmIDwtIEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEKICBkZiAlPiUKICAgIGZpbHRlcighaXMubmEoLmRhdGFbW21dXSkpICU+JQogICAgZ3JvdXBfYnkoc2V1cmF0X2NsdXN0ZXJzLCBsYWJlbCA9IC5kYXRhW1ttXV0pICU+JQogICAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JQogICAgZ3JvdXBfYnkoc2V1cmF0X2NsdXN0ZXJzKSAlPiUKICAgIHNsaWNlX21heChuLCBuID0gMSwgd2l0aF90aWVzID0gRkFMU0UpICU+JQogICAgbXV0YXRlKG1ldGhvZCA9IG0pCn0pCgojIFNldCBtZXRob2Qgb3JkZXIKYW5ub3RhdGlvbl9zdW1tYXJ5JG1ldGhvZCA8LSBmYWN0b3IoYW5ub3RhdGlvbl9zdW1tYXJ5JG1ldGhvZCwgbGV2ZWxzID0gbWV0aG9kcykKCmhlYWQoYW5ub3RhdGlvbl9zdW1tYXJ5KQoKIyBTYXZlIGFubm90YXRpb24gc3VtbWFyeSB0YWJsZQojd3JpdGUuY3N2KGFubm90YXRpb25fc3VtbWFyeSwgImFubm90YXRpb25fc3VtbWFyeV9IZXJyZXJhX3dpdGhfc2NBVE9NSUNfMDQtMDItMjAyNi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAojIFNhdmUgUkRTCmBgYHtyfQoKIyMgU2F2ZSB1cGRhdGVkIG9iamVjdCB3aXRoIHNjQVRPTUlDIGFubm90YXRpb25zCgojIHNhdmVSRFMoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKIyAgICAgICAgIGZpbGUgPSAiL2hvbWUvYmlvaW5mby8xLVRoZXNpc19GaW5hbF9ZZWFyXzIwMjUvMjAyNS1ZZWFyM19BbmFseXNpcy8xLXNjUk5BX1JFU1VMVFMtMTktMTEtMjAyNS8xNy1IZXJyZXJhX0RBVEFfQ0VMTF9Bbm5vdGF0aW9uL0FsbF9zYW1wbGVzX0hlcnJlcmFfd2l0aF9zY0FUT01JQ18wNC0wMi0yMDI2LnJkcyIpCgpjYXQoIlxu4pyTIFNhdmVkIHVwZGF0ZWQgb2JqZWN0IHdpdGggc2NBVE9NSUMgYW5ub3RhdGlvbnMhXG4iKQpjYXQoIkZpbGU6IEFsbF9zYW1wbGVzX0hlcnJlcmFfd2l0aF9zY0FUT01JQ18wNC0wMi0yMDI2LnJkc1xuIikKY2F0KCJMb2NhdGlvbjogMTctSGVycmVyYV9EQVRBX0NFTExfQW5ub3RhdGlvbi9cbiIpCmNhdCgiUmVhZHkgZm9yIENyb3NzLU1ldGhvZCBBbm5vdGF0aW9uIENvbXBhcmlzb24hXG4iKQoKCgpgYGA=