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"          "percent.mt"     
 [8] "RNA_snn_res.0.5" "seurat_clusters" "RNA_snn_res.0.2" "DE_group"        "clonotype"       "TCR_alpha"       "TCR_beta"       
[15] "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

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!
LS0tCnRpdGxlOiAiVHJhbnNmZXIgc2NBVE9NSUMgYW5kIENyb3NzLU1ldGhvZCBBbm5vdGF0aW9uIENvbXBhcmlzb24gVGFibGUgLSBIZXJyZXJhIERhdGFzZXQiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgoKIyMgbG9hZCBsaWJyYXJpZXMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgogICAgbGlicmFyeShTZXVyYXQpCiAgICBsaWJyYXJ5KGRwbHlyKQogICAgbGlicmFyeShwYXRjaHdvcmspCiAgICBsaWJyYXJ5KGdncGxvdDIpCiAgICBsaWJyYXJ5KHBoZWF0bWFwKQogICAgbGlicmFyeShzY1ByZWQpCiAgICBsaWJyYXJ5KGNlbGxkZXgpCiAgICBsaWJyYXJ5KFNpbmdsZVIpCiAgICBsaWJyYXJ5KHJlbW90ZXMpCiAgICBsaWJyYXJ5KHByZXN0bykKICAgIGxpYnJhcnkoU2V1cmF0RGlzaykKICAgIGxpYnJhcnkoU2V1cmF0RGF0YSkKICAgIGxpYnJhcnkoQXppbXV0aCkKCmBgYAoKCgoKIyBMb2FkIFJEUyB3aXRoIGFsbCBhbm5vdGF0aW9ucwpgYGB7cn0KCiMgTG9hZCBtYWluIG9iamVjdCB3aXRoIGFsbCBhbm5vdGF0aW9ucwpBbGxfc2FtcGxlc19NZXJnZWQgPC0gcmVhZFJEUygiL2hvbWUvYmlvaW5mby8xLVRoZXNpc19GaW5hbF9ZZWFyXzIwMjUvMjAyNS1ZZWFyM19BbmFseXNpcy8xLXNjUk5BX1JFU1VMVFMtMTktMTEtMjAyNS8xNy1IZXJyZXJhX0RBVEFfQ0VMTF9Bbm5vdGF0aW9uL0FsbF9zYW1wbGVzX0hlcnJlcmFfd2l0aF9hbGxfYW5ub3RhdGlvbnNfQVRMQVMtSGVycmVyYS0wMy0wMi0yMDI2LnJkcyIpCgojIExvYWQgc2NBVE9NSUMgb2JqZWN0CnNjQVRPTUlDX29iaiA8LSByZWFkUkRTKCIvaG9tZS9iaW9pbmZvLzEtVGhlc2lzX0ZpbmFsX1llYXJfMjAyNS8yMDI1LVllYXIzX0FuYWx5c2lzLzEtc2NSTkFfUkVTVUxUUy0xOS0xMS0yMDI1LzE3LUhlcnJlcmFfREFUQV9DRUxMX0Fubm90YXRpb24vQWxsX3NhbXBsZXNfSGVycmVyYV9zY0FUT01JQ19IZXJyZXJhXzA0LTAyLTIwMjYucmRzIikKCklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJzZXVyYXRfY2x1c3RlcnMiCmNhdCgiQ2x1c3RlcnMgaW4gQWxsX3NhbXBsZXNfTWVyZ2VkOlxuIikKcHJpbnQodGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkQGFjdGl2ZS5pZGVudCkpCgoKYGBgCgojIyBDaGVjayBtZXRhZGF0YSBjb2x1bW5zCgpgYGB7ciB9CmNhdCgiXG5zY0FUT01JQ19vYmogbWV0YWRhdGEgY29sdW1uczpcbiIpCnByaW50KGNvbG5hbWVzKHNjQVRPTUlDX29iakBtZXRhLmRhdGEpKQoKYGBgCiMjIENoZWNrIG1ldGFkYXRhIGNvbHVtbnMKYGBge3IgfQojIyBUcmFuc2ZlciBzY0FUT01JQyBsYWJlbHMgdG8gbWFpbiBvYmplY3QKCiMgVHJhbnNmZXIgc2NBVE9NSUMgcHJlZGljdGlvbnMKQWxsX3NhbXBsZXNfTWVyZ2VkJHNjQVRPTUlDX2Fubm90YXRpb24gPC0gc2NBVE9NSUNfb2JqQG1ldGEuZGF0YVtjb2xuYW1lcyhBbGxfc2FtcGxlc19NZXJnZWQpLCAic2NBVE9NSUNfcHJlZCJdCgojIFZlcmlmeSB0cmFuc2ZlcgpjYXQoIlxuVHJhbnNmZXJyZWQgc2NBVE9NSUMgYW5ub3RhdGlvbnM6XG4iKQpwcmludCh0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkc2NBVE9NSUNfYW5ub3RhdGlvbiwgdXNlTkEgPSAiYWx3YXlzIikpCgojIENoZWNrIGNvdmVyYWdlCmNhdCgiXG5DZWxscyB3aXRoIHNjQVRPTUlDIGFubm90YXRpb246Iiwgc3VtKCFpcy5uYShBbGxfc2FtcGxlc19NZXJnZWQkc2NBVE9NSUNfYW5ub3RhdGlvbikpLCAiXG4iKQpjYXQoIlRvdGFsIGNlbGxzOiIsIG5jb2woQWxsX3NhbXBsZXNfTWVyZ2VkKSwgIlxuIikKY2F0KCJDb3ZlcmFnZToiLCByb3VuZChzdW0oIWlzLm5hKEFsbF9zYW1wbGVzX01lcmdlZCRzY0FUT01JQ19hbm5vdGF0aW9uKSkvbmNvbChBbGxfc2FtcGxlc19NZXJnZWQpKjEwMCwgMiksICIlXG4iKQoKIyBWZXJpZnkgdGhlIGNvbHVtbiB3YXMgYWRkZWQKY2F0KCJcbk5ldyBjb2x1bW4gYWRkZWQgdG8gbWV0YWRhdGE6XG4iKQpjYXQoInNjQVRPTUlDX2Fubm90YXRpb246IiwgInNjQVRPTUlDX2Fubm90YXRpb24iICVpbiUgY29sbmFtZXMoQWxsX3NhbXBsZXNfTWVyZ2VkQG1ldGEuZGF0YSksICJcbiIpCgoKYGBgCiMgQ3JlYXRlIGFubm90YXRpb24gc3VtbWFyeSB0YWJsZQpgYGB7ciB9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkocHVycnIpCgojIERlZmluZSBhbm5vdGF0aW9uIG1ldGhvZHMgKHJlbW92ZWQgU1RDQVQpCm1ldGhvZHMgPC0gYygKICAicHJlZGljdGVkLmlkIiwgICAgICAgICAgICAgIyBzY1ByZWQKICAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwgICAgIyBBemltdXRoIChsMiBwcmVkaWN0aW9uKQogICJzaW5nbGVyLmltbXVuZSIsICAgICAgICAgICAjIFNpbmdsZVIKICAic2NBVE9NSUNfYW5ub3RhdGlvbiIgICAgICAgIyBzY0FUT01JQwopCgojIENyZWF0ZSBzdW1tYXJ5IC0gbW9zdCBjb21tb24gbGFiZWwgcGVyIGNsdXN0ZXIgZm9yIGVhY2ggbWV0aG9kCmFubm90YXRpb25fc3VtbWFyeSA8LSBtYXBfZGZyKG1ldGhvZHMsIGZ1bmN0aW9uKG0pIHsKICBkZiA8LSBBbGxfc2FtcGxlc19NZXJnZWRAbWV0YS5kYXRhCiAgZGYgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKC5kYXRhW1ttXV0pKSAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycywgbGFiZWwgPSAuZGF0YVtbbV1dKSAlPiUKICAgIHN1bW1hcmlzZShuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICAgIGdyb3VwX2J5KHNldXJhdF9jbHVzdGVycykgJT4lCiAgICBzbGljZV9tYXgobiwgbiA9IDEsIHdpdGhfdGllcyA9IEZBTFNFKSAlPiUKICAgIG11dGF0ZShtZXRob2QgPSBtKQp9KQoKIyBTZXQgbWV0aG9kIG9yZGVyCmFubm90YXRpb25fc3VtbWFyeSRtZXRob2QgPC0gZmFjdG9yKGFubm90YXRpb25fc3VtbWFyeSRtZXRob2QsIGxldmVscyA9IG1ldGhvZHMpCgpoZWFkKGFubm90YXRpb25fc3VtbWFyeSkKCiMgU2F2ZSBhbm5vdGF0aW9uIHN1bW1hcnkgdGFibGUKd3JpdGUuY3N2KGFubm90YXRpb25fc3VtbWFyeSwgImFubm90YXRpb25fc3VtbWFyeV9IZXJyZXJhX3dpdGhfc2NBVE9NSUNfMDQtMDItMjAyNi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKCmBgYAojIFNhdmUgUkRTCmBgYHtyfQoKIyMgU2F2ZSB1cGRhdGVkIG9iamVjdCB3aXRoIHNjQVRPTUlDIGFubm90YXRpb25zCgpzYXZlUkRTKEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgZmlsZSA9ICIvaG9tZS9iaW9pbmZvLzEtVGhlc2lzX0ZpbmFsX1llYXJfMjAyNS8yMDI1LVllYXIzX0FuYWx5c2lzLzEtc2NSTkFfUkVTVUxUUy0xOS0xMS0yMDI1LzE3LUhlcnJlcmFfREFUQV9DRUxMX0Fubm90YXRpb24vQWxsX3NhbXBsZXNfSGVycmVyYV93aXRoX3NjQVRPTUlDXzA0LTAyLTIwMjYucmRzIikKCmNhdCgiXG7inJMgU2F2ZWQgdXBkYXRlZCBvYmplY3Qgd2l0aCBzY0FUT01JQyBhbm5vdGF0aW9ucyFcbiIpCmNhdCgiRmlsZTogQWxsX3NhbXBsZXNfSGVycmVyYV93aXRoX3NjQVRPTUlDXzA0LTAyLTIwMjYucmRzXG4iKQpjYXQoIkxvY2F0aW9uOiAxNy1IZXJyZXJhX0RBVEFfQ0VMTF9Bbm5vdGF0aW9uL1xuIikKY2F0KCJSZWFkeSBmb3IgQ3Jvc3MtTWV0aG9kIEFubm90YXRpb24gQ29tcGFyaXNvbiFcbiIpCgoKCmBgYA==