1 Load libraries

2 Step 1: Load Datasets (CD4T_10x Naming)

2.1 CD4T_10x_S1 (Male CITE-seq)


# Load CITE-seq H5 file
male_list <- Read10X_h5(
  "Normal_PBMC_Samples-23-02-2026/10x_sample1_Same_PBMC_10x_incudingCITESEQ_TCR_Male27/sc5p_v2_hs_PBMC_10k_multi_5gex_5fb_b_t_count_filtered_feature_bc_matrix.h5",
  use.names = TRUE
)
names(male_list)
[1] "Gene Expression"  "Antibody Capture"
cd4t_s1 <- CreateSeuratObject(
  counts = male_list[["Gene Expression"]],
  project = "CD4T_10x_S1",
  min.cells = 3, min.features = 200
)

adt_counts <- male_list[["Antibody Capture"]][, colnames(cd4t_s1)]
rownames(adt_counts) <- gsub("_", "-", rownames(adt_counts))
cd4t_s1[["ADT"]] <- CreateAssay5Object(counts = adt_counts)

cd4t_s1$dataset <- "CD4T_10x_S1"
cd4t_s1
An object of class Seurat 
20245 features across 10529 samples within 2 assays 
Active assay: RNA (20226 features, 0 variable features)
 1 layer present: counts
 1 other assay present: ADT

2.2 CD4T_10x_S2 (Female Intronic)

female_data <- Read10X_h5(
  "Normal_PBMC_Samples-23-02-2026/10x_sample2_TCR_available_Female25-30/10k_PBMC_5pv2_nextgem_Chromium_X_intron_10k_PBMC_5pv2_nextgem_Chromium_X_intron_count_sample_feature_bc_matrix.h5",
  use.names = TRUE
)

counts_matrix <- if(is.list(female_data) && length(female_data)>0) female_data[[1]] else female_data

cd4t_s2 <- CreateSeuratObject(
  counts = counts_matrix,
  project = "CD4T_10x_S2",
  min.cells = 3, min.features = 200
)
cd4t_s2$dataset <- "CD4T_10x_S2"
cd4t_s2
An object of class Seurat 
23144 features across 9731 samples within 1 assay 
Active assay: RNA (23144 features, 0 variable features)
 1 layer present: counts

2.3 Your CD4T_lab (subset from sezary_obj)

All_samples_Merged <- readRDS(
  "/home/bioinfo/1-Thesis_Final_Year_2025/2025-Year3_Analysis/1-scRNA_RESULTS-19-11-2025/0-Seurat_RDS_Final_OBJECT/All_samples_Merged_with_Renamed_Clusters_final-26-10-2025.rds"
)

cd4t_lab <- subset(All_samples_Merged, subset = orig.ident == "CD4T_lab")
cd4t_lab$dataset <- "CD4T_lab"
DefaultAssay(cd4t_lab) <- "RNA"
cd4t_lab
An object of class Seurat 
62900 features across 5106 samples within 6 assays 
Active assay: RNA (36601 features, 0 variable features)
 2 layers present: data, counts
 5 other assays present: ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3, SCT
 5 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap, harmony

3 Quality Control Functions

compute_qc <- function(obj) {
  DefaultAssay(obj) <- "RNA"
  obj[["percent.mt"]] <- PercentageFeatureSet(obj, pattern = "^MT-")
  obj$percent.mt <- replace(as.numeric(obj$percent.mt), is.na(obj$percent.mt), 0)
  obj
}

cd4t_s1 <- compute_qc(cd4t_s1)
cd4t_s2 <- compute_qc(cd4t_s2)
cd4t_lab <- compute_qc(cd4t_lab)

3.1 Pre-filter QC Plots

pre_qc <- merge(cd4t_s1, y = list(cd4t_s2, cd4t_lab))
VlnPlot(pre_qc, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), 
        group.by = "dataset", pt.size = 0, ncol = 3)


p1 <- FeatureScatter(pre_qc, "nCount_RNA", "nFeature_RNA", group.by = "dataset")
p2 <- FeatureScatter(pre_qc, "nCount_RNA", "percent.mt", group.by = "dataset")
p3 <- FeatureScatter(pre_qc, "nFeature_RNA", "percent.mt", group.by = "dataset")
p1 | p2 | p3

3.2 YOUR Exact Filtering Parameters

# Your Sezary Syndrome filtering (exact)
your_filter <- function(obj) {
  subset(obj, subset = 
    nFeature_RNA > 500 & nFeature_RNA < 7000 & 
    nCount_RNA < 40000 & percent.mt < 7.5 & percent.mt > 0.1
  )
}

cd4t_s1 <- your_filter(cd4t_s1)
cd4t_s2 <- your_filter(cd4t_s2)
cd4t_lab <- your_filter(cd4t_lab)

cat("=== CELLS AFTER YOUR FILTERING ===\n")
=== CELLS AFTER YOUR FILTERING ===
cat("CD4T_10x_S1:", ncol(cd4t_s1), "\n")
CD4T_10x_S1: 9867 
cat("CD4T_10x_S2:", ncol(cd4t_s2), "\n")
CD4T_10x_S2: 6861 
cat("CD4T_lab:  ", ncol(cd4t_lab), "\n")
CD4T_lab:   5106 

3.3 Post-filter QC

4 Normalization (Individual → Harmony)

cat("=== COMPLETE NORMALIZATION (S1/S2/Lab + Dummy ADT) ===\n")
=== COMPLETE NORMALIZATION (S1/S2/Lab + Dummy ADT) ===
# 1. RNA Normalization (ALL 3 samples)
cd4t_s1 <- NormalizeData(cd4t_s1, verbose = FALSE); cat("✅ RNA S1\n")
✅ RNA S1
cd4t_s2 <- NormalizeData(cd4t_s2, verbose = FALSE); cat("✅ RNA S2\n")
✅ RNA S2
cd4t_lab <- NormalizeData(cd4t_lab, verbose = FALSE); cat("✅ RNA Lab\n")
✅ RNA Lab
# 2. Universal ADT Normalization (Real + Dummy)
normalize_all_adt <- function() {
  for(sample_name in c("cd4t_s1", "cd4t_s2", "cd4t_lab")) {
    obj <- get(sample_name)
    
    # All now have ADT (real or dummy) ✓
    if("ADT" %in% names(obj@assays)) {
      cat("ADT normalizing:", sample_name, "\n")
      DefaultAssay(obj) <- "ADT"
      obj <- NormalizeData(obj, normalization.method = "CLR", margin = 2, verbose = FALSE)
      cat("  →", sample_name, "ADT CLR ✓\n")
    }
    
    # Always reset to RNA
    DefaultAssay(obj) <- "RNA"
    assign(sample_name, obj, envir = .GlobalEnv)
  }
}

normalize_all_adt()
ADT normalizing: cd4t_s1 
  → cd4t_s1 ADT CLR ✓
ADT normalizing: cd4t_lab 
  → cd4t_lab ADT CLR ✓
cat("\n🎯 ALL NORMALIZED → READY FOR HARMONY!\n")

🎯 ALL NORMALIZED → READY FOR HARMONY!
# Quick verification
cat("\nActive assays:\n")

Active assays:
cat("S1: ", DefaultAssay(cd4t_s1), "\n")
S1:  RNA 
cat("S2: ", DefaultAssay(cd4t_s2), "\n") 
S2:  RNA 
cat("Lab:", DefaultAssay(cd4t_lab), "\n")
Lab: RNA 

4.1 FIXED Seurat v5 Script (No Internal Functions)


# ✅ 1. Seurat v5 global option (safe)
options(Seurat.object.assay.version = "v5")

# ✅ 2. Universal V5 converter (production-ready)
convert_to_v5 <- function(obj, assay_name = "ADT") {
  if(assay_name %in% names(obj@assays)) {
    # Convert legacy Assay → Assay5
    if(!inherits(obj[[assay_name]], "Assay5")) {
      cat("Converting", assay_name, "to v5...\n")
      old_assay <- obj[[assay_name]]
      new_assay <- CreateAssay5Object(counts = old_assay@counts)
      obj[[assay_name]] <- new_assay
    }
  } else {
    # Add dummy ADT if missing (V5 standard)
    cat("Adding dummy ADT (v5)...\n")
    dummy <- Matrix::Matrix(0, nrow = 28, ncol = ncol(obj),
                           dimnames = list(paste0("Dummy_ADT_", 1:28),
                                          colnames(obj)))
    obj[["ADT"]] <- CreateAssay5Object(counts = dummy)
  }
  return(obj)
}

# ✅ 3. Convert ALL samples
cd4t_s1 <- convert_to_v5(cd4t_s1);   cat("S1 ✓\n")
S1 ✓
cd4t_s2 <- convert_to_v5(cd4t_s2);   cat("S2 ✓\n")  # Gets dummy
Adding dummy ADT (v5)...
S2 ✓
cd4t_lab <- convert_to_v5(cd4t_lab); cat("Lab ✓\n")
Converting ADT to v5...
Lab ✓
cat("\n✅ ALL OBJECTS NOW SEURAT V5!\n")

✅ ALL OBJECTS NOW SEURAT V5!

5 PURE V5 ADT Verification

# Seurat v5 LayerData (universal access)
for(name in c("cd4t_s1", "cd4t_s2", "cd4t_lab")) {
  obj <- get(name)
  adt_counts <- LayerData(obj[["ADT"]], layer = "counts")
  
  cat("\n", name, "- ADT:", nrow(adt_counts), "×", ncol(adt_counts), "\n")
  total <- sum(adt_counts)
  cat("  Sum:", total, ifelse(total==0, "DUMMY ✓", "REAL ✓"), "\n")
}

 cd4t_s1 - ADT: 19 × 9867 
  Sum: 27462748 REAL ✓ 

 cd4t_s2 - ADT: 28 × 6861 
  Sum: 0 DUMMY ✓ 

 cd4t_lab - ADT: 28 × 5106 
  Sum: 6401555 REAL ✓ 

6 Harmony Integration (Fixed Merge)

# FIXED: Proper object names + cell IDs
healthy <- merge(cd4t_s1, y = list(cd4t_s2, cd4t_lab),
                 add.cell.ids = c("CD4T_10x_S1", "CD4T_10x_S2", "CD4T_lab"),
                 merge.data = FALSE)

DefaultAssay(healthy) <- "RNA"

# Preprocessing
healthy <- FindVariableFeatures(healthy, nfeatures = 3000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
healthy <- ScaleData(healthy, vars.to.regress = "percent.mt")

  |                                                                                                                             
  |                                                                                                                       |   0%
  |                                                                                                                             
  |=                                                                                                                      |   0%
  |                                                                                                                             
  |=                                                                                                                      |   1%
  |                                                                                                                             
  |==                                                                                                                     |   1%
  |                                                                                                                             
  |==                                                                                                                     |   2%
  |                                                                                                                             
  |===                                                                                                                    |   2%
  |                                                                                                                             
  |===                                                                                                                    |   3%
  |                                                                                                                             
  |====                                                                                                                   |   3%
  |                                                                                                                             
  |====                                                                                                                   |   4%
  |                                                                                                                             
  |=====                                                                                                                  |   4%
  |                                                                                                                             
  |=====                                                                                                                  |   5%
  |                                                                                                                             
  |======                                                                                                                 |   5%
  |                                                                                                                             
  |=======                                                                                                                |   5%
  |                                                                                                                             
  |=======                                                                                                                |   6%
  |                                                                                                                             
  |========                                                                                                               |   6%
  |                                                                                                                             
  |========                                                                                                               |   7%
  |                                                                                                                             
  |=========                                                                                                              |   7%
  |                                                                                                                             
  |=========                                                                                                              |   8%
  |                                                                                                                             
  |==========                                                                                                             |   8%
  |                                                                                                                             
  |==========                                                                                                             |   9%
  |                                                                                                                             
  |===========                                                                                                            |   9%
  |                                                                                                                             
  |===========                                                                                                            |  10%
  |                                                                                                                             
  |============                                                                                                           |  10%
  |                                                                                                                             
  |=============                                                                                                          |  11%
  |                                                                                                                             
  |==============                                                                                                         |  11%
  |                                                                                                                             
  |==============                                                                                                         |  12%
  |                                                                                                                             
  |===============                                                                                                        |  12%
  |                                                                                                                             
  |===============                                                                                                        |  13%
  |                                                                                                                             
  |================                                                                                                       |  13%
  |                                                                                                                             
  |================                                                                                                       |  14%
  |                                                                                                                             
  |=================                                                                                                      |  14%
  |                                                                                                                             
  |=================                                                                                                      |  15%
  |                                                                                                                             
  |==================                                                                                                     |  15%
  |                                                                                                                             
  |==================                                                                                                     |  16%
  |                                                                                                                             
  |===================                                                                                                    |  16%
  |                                                                                                                             
  |====================                                                                                                   |  16%
  |                                                                                                                             
  |====================                                                                                                   |  17%
  |                                                                                                                             
  |=====================                                                                                                  |  17%
  |                                                                                                                             
  |=====================                                                                                                  |  18%
  |                                                                                                                             
  |======================                                                                                                 |  18%
  |                                                                                                                             
  |======================                                                                                                 |  19%
  |                                                                                                                             
  |=======================                                                                                                |  19%
  |                                                                                                                             
  |=======================                                                                                                |  20%
  |                                                                                                                             
  |========================                                                                                               |  20%
  |                                                                                                                             
  |========================                                                                                               |  21%
  |                                                                                                                             
  |=========================                                                                                              |  21%
  |                                                                                                                             
  |==========================                                                                                             |  21%
  |                                                                                                                             
  |==========================                                                                                             |  22%
  |                                                                                                                             
  |===========================                                                                                            |  22%
  |                                                                                                                             
  |===========================                                                                                            |  23%
  |                                                                                                                             
  |============================                                                                                           |  23%
  |                                                                                                                             
  |============================                                                                                           |  24%
  |                                                                                                                             
  |=============================                                                                                          |  24%
  |                                                                                                                             
  |=============================                                                                                          |  25%
  |                                                                                                                             
  |==============================                                                                                         |  25%
  |                                                                                                                             
  |==============================                                                                                         |  26%
  |                                                                                                                             
  |===============================                                                                                        |  26%
  |                                                                                                                             
  |================================                                                                                       |  26%
  |                                                                                                                             
  |================================                                                                                       |  27%
  |                                                                                                                             
  |=================================                                                                                      |  27%
  |                                                                                                                             
  |=================================                                                                                      |  28%
  |                                                                                                                             
  |==================================                                                                                     |  28%
  |                                                                                                                             
  |==================================                                                                                     |  29%
  |                                                                                                                             
  |===================================                                                                                    |  29%
  |                                                                                                                             
  |===================================                                                                                    |  30%
  |                                                                                                                             
  |====================================                                                                                   |  30%
  |                                                                                                                             
  |====================================                                                                                   |  31%
  |                                                                                                                             
  |=====================================                                                                                  |  31%
  |                                                                                                                             
  |=====================================                                                                                  |  32%
  |                                                                                                                             
  |======================================                                                                                 |  32%
  |                                                                                                                             
  |=======================================                                                                                |  32%
  |                                                                                                                             
  |=======================================                                                                                |  33%
  |                                                                                                                             
  |========================================                                                                               |  33%
  |                                                                                                                             
  |========================================                                                                               |  34%
  |                                                                                                                             
  |=========================================                                                                              |  34%
  |                                                                                                                             
  |=========================================                                                                              |  35%
  |                                                                                                                             
  |==========================================                                                                             |  35%
  |                                                                                                                             
  |==========================================                                                                             |  36%
  |                                                                                                                             
  |===========================================                                                                            |  36%
  |                                                                                                                             
  |===========================================                                                                            |  37%
  |                                                                                                                             
  |============================================                                                                           |  37%
  |                                                                                                                             
  |=============================================                                                                          |  37%
  |                                                                                                                             
  |=============================================                                                                          |  38%
  |                                                                                                                             
  |==============================================                                                                         |  38%
  |                                                                                                                             
  |==============================================                                                                         |  39%
  |                                                                                                                             
  |===============================================                                                                        |  39%
  |                                                                                                                             
  |===============================================                                                                        |  40%
  |                                                                                                                             
  |================================================                                                                       |  40%
  |                                                                                                                             
  |================================================                                                                       |  41%
  |                                                                                                                             
  |=================================================                                                                      |  41%
  |                                                                                                                             
  |=================================================                                                                      |  42%
  |                                                                                                                             
  |==================================================                                                                     |  42%
  |                                                                                                                             
  |===================================================                                                                    |  42%
  |                                                                                                                             
  |===================================================                                                                    |  43%
  |                                                                                                                             
  |====================================================                                                                   |  43%
  |                                                                                                                             
  |====================================================                                                                   |  44%
  |                                                                                                                             
  |=====================================================                                                                  |  44%
  |                                                                                                                             
  |=====================================================                                                                  |  45%
  |                                                                                                                             
  |======================================================                                                                 |  45%
  |                                                                                                                             
  |======================================================                                                                 |  46%
  |                                                                                                                             
  |=======================================================                                                                |  46%
  |                                                                                                                             
  |=======================================================                                                                |  47%
  |                                                                                                                             
  |========================================================                                                               |  47%
  |                                                                                                                             
  |=========================================================                                                              |  48%
  |                                                                                                                             
  |==========================================================                                                             |  48%
  |                                                                                                                             
  |==========================================================                                                             |  49%
  |                                                                                                                             
  |===========================================================                                                            |  49%
  |                                                                                                                             
  |===========================================================                                                            |  50%
  |                                                                                                                             
  |============================================================                                                           |  50%
  |                                                                                                                             
  |============================================================                                                           |  51%
  |                                                                                                                             
  |=============================================================                                                          |  51%
  |                                                                                                                             
  |=============================================================                                                          |  52%
  |                                                                                                                             
  |==============================================================                                                         |  52%
  |                                                                                                                             
  |===============================================================                                                        |  53%
  |                                                                                                                             
  |================================================================                                                       |  53%
  |                                                                                                                             
  |================================================================                                                       |  54%
  |                                                                                                                             
  |=================================================================                                                      |  54%
  |                                                                                                                             
  |=================================================================                                                      |  55%
  |                                                                                                                             
  |==================================================================                                                     |  55%
  |                                                                                                                             
  |==================================================================                                                     |  56%
  |                                                                                                                             
  |===================================================================                                                    |  56%
  |                                                                                                                             
  |===================================================================                                                    |  57%
  |                                                                                                                             
  |====================================================================                                                   |  57%
  |                                                                                                                             
  |====================================================================                                                   |  58%
  |                                                                                                                             
  |=====================================================================                                                  |  58%
  |                                                                                                                             
  |======================================================================                                                 |  58%
  |                                                                                                                             
  |======================================================================                                                 |  59%
  |                                                                                                                             
  |=======================================================================                                                |  59%
  |                                                                                                                             
  |=======================================================================                                                |  60%
  |                                                                                                                             
  |========================================================================                                               |  60%
  |                                                                                                                             
  |========================================================================                                               |  61%
  |                                                                                                                             
  |=========================================================================                                              |  61%
  |                                                                                                                             
  |=========================================================================                                              |  62%
  |                                                                                                                             
  |==========================================================================                                             |  62%
  |                                                                                                                             
  |==========================================================================                                             |  63%
  |                                                                                                                             
  |===========================================================================                                            |  63%
  |                                                                                                                             
  |============================================================================                                           |  63%
  |                                                                                                                             
  |============================================================================                                           |  64%
  |                                                                                                                             
  |=============================================================================                                          |  64%
  |                                                                                                                             
  |=============================================================================                                          |  65%
  |                                                                                                                             
  |==============================================================================                                         |  65%
  |                                                                                                                             
  |==============================================================================                                         |  66%
  |                                                                                                                             
  |===============================================================================                                        |  66%
  |                                                                                                                             
  |===============================================================================                                        |  67%
  |                                                                                                                             
  |================================================================================                                       |  67%
  |                                                                                                                             
  |================================================================================                                       |  68%
  |                                                                                                                             
  |=================================================================================                                      |  68%
  |                                                                                                                             
  |==================================================================================                                     |  68%
  |                                                                                                                             
  |==================================================================================                                     |  69%
  |                                                                                                                             
  |===================================================================================                                    |  69%
  |                                                                                                                             
  |===================================================================================                                    |  70%
  |                                                                                                                             
  |====================================================================================                                   |  70%
  |                                                                                                                             
  |====================================================================================                                   |  71%
  |                                                                                                                             
  |=====================================================================================                                  |  71%
  |                                                                                                                             
  |=====================================================================================                                  |  72%
  |                                                                                                                             
  |======================================================================================                                 |  72%
  |                                                                                                                             
  |======================================================================================                                 |  73%
  |                                                                                                                             
  |=======================================================================================                                |  73%
  |                                                                                                                             
  |=======================================================================================                                |  74%
  |                                                                                                                             
  |========================================================================================                               |  74%
  |                                                                                                                             
  |=========================================================================================                              |  74%
  |                                                                                                                             
  |=========================================================================================                              |  75%
  |                                                                                                                             
  |==========================================================================================                             |  75%
  |                                                                                                                             
  |==========================================================================================                             |  76%
  |                                                                                                                             
  |===========================================================================================                            |  76%
  |                                                                                                                             
  |===========================================================================================                            |  77%
  |                                                                                                                             
  |============================================================================================                           |  77%
  |                                                                                                                             
  |============================================================================================                           |  78%
  |                                                                                                                             
  |=============================================================================================                          |  78%
  |                                                                                                                             
  |=============================================================================================                          |  79%
  |                                                                                                                             
  |==============================================================================================                         |  79%
  |                                                                                                                             
  |===============================================================================================                        |  79%
  |                                                                                                                             
  |===============================================================================================                        |  80%
  |                                                                                                                             
  |================================================================================================                       |  80%
  |                                                                                                                             
  |================================================================================================                       |  81%
  |                                                                                                                             
  |=================================================================================================                      |  81%
  |                                                                                                                             
  |=================================================================================================                      |  82%
  |                                                                                                                             
  |==================================================================================================                     |  82%
  |                                                                                                                             
  |==================================================================================================                     |  83%
  |                                                                                                                             
  |===================================================================================================                    |  83%
  |                                                                                                                             
  |===================================================================================================                    |  84%
  |                                                                                                                             
  |====================================================================================================                   |  84%
  |                                                                                                                             
  |=====================================================================================================                  |  84%
  |                                                                                                                             
  |=====================================================================================================                  |  85%
  |                                                                                                                             
  |======================================================================================================                 |  85%
  |                                                                                                                             
  |======================================================================================================                 |  86%
  |                                                                                                                             
  |=======================================================================================================                |  86%
  |                                                                                                                             
  |=======================================================================================================                |  87%
  |                                                                                                                             
  |========================================================================================================               |  87%
  |                                                                                                                             
  |========================================================================================================               |  88%
  |                                                                                                                             
  |=========================================================================================================              |  88%
  |                                                                                                                             
  |=========================================================================================================              |  89%
  |                                                                                                                             
  |==========================================================================================================             |  89%
  |                                                                                                                             
  |===========================================================================================================            |  90%
  |                                                                                                                             
  |============================================================================================================           |  90%
  |                                                                                                                             
  |============================================================================================================           |  91%
  |                                                                                                                             
  |=============================================================================================================          |  91%
  |                                                                                                                             
  |=============================================================================================================          |  92%
  |                                                                                                                             
  |==============================================================================================================         |  92%
  |                                                                                                                             
  |==============================================================================================================         |  93%
  |                                                                                                                             
  |===============================================================================================================        |  93%
  |                                                                                                                             
  |===============================================================================================================        |  94%
  |                                                                                                                             
  |================================================================================================================       |  94%
  |                                                                                                                             
  |================================================================================================================       |  95%
  |                                                                                                                             
  |=================================================================================================================      |  95%
  |                                                                                                                             
  |==================================================================================================================     |  95%
  |                                                                                                                             
  |==================================================================================================================     |  96%
  |                                                                                                                             
  |===================================================================================================================    |  96%
  |                                                                                                                             
  |===================================================================================================================    |  97%
  |                                                                                                                             
  |====================================================================================================================   |  97%
  |                                                                                                                             
  |====================================================================================================================   |  98%
  |                                                                                                                             
  |=====================================================================================================================  |  98%
  |                                                                                                                             
  |=====================================================================================================================  |  99%
  |                                                                                                                             
  |====================================================================================================================== |  99%
  |                                                                                                                             
  |====================================================================================================================== | 100%
  |                                                                                                                             
  |=======================================================================================================================| 100%

  |                                                                                                                             
  |                                                                                                                       |   0%
  |                                                                                                                             
  |========================================                                                                               |  33%
  |                                                                                                                             
  |===============================================================================                                        |  67%
  |                                                                                                                             
  |=======================================================================================================================| 100%
healthy <- RunPCA(healthy, npcs = 50)

ElbowPlot(healthy, ndims = 50)

6.1 Perform PCA TEST

library(ggplot2)
library(RColorBrewer)  

# Assuming you have 10 different cell lines, generating a color palette with 10 colors
cell_line_colors <- brewer.pal(10, "Set3")

# Assuming All_samples_Merged$cell_line is a factor or character vector containing cell line names
data <- as.data.frame(table(healthy$dataset))
colnames(data) <- c("cell_line", "nUMI")  # Change column name to nUMI

ncells <- ggplot(data, aes(x = cell_line, y = nUMI, fill = cell_line)) + 
  geom_col() +
  theme_classic() +
  geom_text(aes(label = nUMI), 
            position = position_dodge(width = 0.9), 
            vjust = -0.25) +
  scale_fill_manual(values = cell_line_colors) + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        plot.title = element_text(hjust = 0.5)) +  # Adjust the title position
  ggtitle("Filtered cells per sample") +
  xlab("PBMC samples") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)

7 Advanced PC Selection (Optional)

# TEST-1
# given that the output of RunPCA is "pca"
# replace "so" by the name of your seurat object

pct <- All_samples_Merged[["pca"]]@stdev / sum(All_samples_Merged[["pca"]]@stdev) * 100
cumu <- cumsum(pct) # Calculate cumulative percents for each PC
# Determine the difference between variation of PC and subsequent PC
co2 <- sort(which((pct[-length(pct)] - pct[-1]) > 0.1), decreasing = T)[1] + 1
# last point where change of % of variation is more than 0.1%. -> co2
co2
[1] 15
# TEST-2
# get significant PCs
stdv <- All_samples_Merged[["pca"]]@stdev
sum.stdv <- sum(All_samples_Merged[["pca"]]@stdev)
percent.stdv <- (stdv / sum.stdv) * 100
cumulative <- cumsum(percent.stdv)
co1 <- which(cumulative > 90 & percent.stdv < 5)[1]
co2 <- sort(which((percent.stdv[1:length(percent.stdv) - 1] - 
                       percent.stdv[2:length(percent.stdv)]) > 0.1), 
              decreasing = T)[1] + 1
min.pc <- min(co1, co2)
min.pc
[1] 15
# Create a dataframe with values
plot_df <- data.frame(pct = percent.stdv, 
           cumu = cumulative, 
           rank = 1:length(percent.stdv))

# Elbow plot to visualize 
  ggplot(plot_df, aes(cumulative, percent.stdv, label = rank, color = rank > min.pc)) + 
  geom_text() + 
  geom_vline(xintercept = 90, color = "grey") + 
  geom_hline(yintercept = min(percent.stdv[percent.stdv > 5]), color = "grey") +
  theme_bw()

8 HARMONY INTEGRATION + UMAP


##  Merge (preserves all normalization)
healthy <- merge(cd4t_s1, y = list(cd4t_s2, cd4t_lab),
                 add.cell.ids = c("CD4T_10x_S1", "CD4T_10x_S2", "CD4T_lab"),
                 merge.data = FALSE)

# ✅ V5 REQUIRED: Join layers post-merge
healthy <- JoinLayers(healthy)
DefaultAssay(healthy) <- "RNA"

cat("Layers joined:", length(healthy@assays$RNA@layers), "→ 1 ✓\n")
Layers joined: 2 → 1 ✓
## Joint preprocessing (variable features across batches)
healthy <- FindVariableFeatures(healthy, nfeatures = 3000)
Calculating gene variances
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Calculating feature variances of standardized and clipped values
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
healthy <- ScaleData(healthy, vars.to.regress = "percent.mt") 

  |                                                                                                                             
  |                                                                                                                       |   0%
  |                                                                                                                             
  |=                                                                                                                      |   0%
  |                                                                                                                             
  |=                                                                                                                      |   1%
  |                                                                                                                             
  |==                                                                                                                     |   1%
  |                                                                                                                             
  |==                                                                                                                     |   2%
  |                                                                                                                             
  |===                                                                                                                    |   2%
  |                                                                                                                             
  |===                                                                                                                    |   3%
  |                                                                                                                             
  |====                                                                                                                   |   3%
  |                                                                                                                             
  |====                                                                                                                   |   4%
  |                                                                                                                             
  |=====                                                                                                                  |   4%
  |                                                                                                                             
  |=====                                                                                                                  |   5%
  |                                                                                                                             
  |======                                                                                                                 |   5%
  |                                                                                                                             
  |=======                                                                                                                |   5%
  |                                                                                                                             
  |=======                                                                                                                |   6%
  |                                                                                                                             
  |========                                                                                                               |   6%
  |                                                                                                                             
  |========                                                                                                               |   7%
  |                                                                                                                             
  |=========                                                                                                              |   7%
  |                                                                                                                             
  |=========                                                                                                              |   8%
  |                                                                                                                             
  |==========                                                                                                             |   8%
  |                                                                                                                             
  |==========                                                                                                             |   9%
  |                                                                                                                             
  |===========                                                                                                            |   9%
  |                                                                                                                             
  |===========                                                                                                            |  10%
  |                                                                                                                             
  |============                                                                                                           |  10%
  |                                                                                                                             
  |=============                                                                                                          |  11%
  |                                                                                                                             
  |==============                                                                                                         |  11%
  |                                                                                                                             
  |==============                                                                                                         |  12%
  |                                                                                                                             
  |===============                                                                                                        |  12%
  |                                                                                                                             
  |===============                                                                                                        |  13%
  |                                                                                                                             
  |================                                                                                                       |  13%
  |                                                                                                                             
  |================                                                                                                       |  14%
  |                                                                                                                             
  |=================                                                                                                      |  14%
  |                                                                                                                             
  |=================                                                                                                      |  15%
  |                                                                                                                             
  |==================                                                                                                     |  15%
  |                                                                                                                             
  |==================                                                                                                     |  16%
  |                                                                                                                             
  |===================                                                                                                    |  16%
  |                                                                                                                             
  |====================                                                                                                   |  16%
  |                                                                                                                             
  |====================                                                                                                   |  17%
  |                                                                                                                             
  |=====================                                                                                                  |  17%
  |                                                                                                                             
  |=====================                                                                                                  |  18%
  |                                                                                                                             
  |======================                                                                                                 |  18%
  |                                                                                                                             
  |======================                                                                                                 |  19%
  |                                                                                                                             
  |=======================                                                                                                |  19%
  |                                                                                                                             
  |=======================                                                                                                |  20%
  |                                                                                                                             
  |========================                                                                                               |  20%
  |                                                                                                                             
  |========================                                                                                               |  21%
  |                                                                                                                             
  |=========================                                                                                              |  21%
  |                                                                                                                             
  |==========================                                                                                             |  21%
  |                                                                                                                             
  |==========================                                                                                             |  22%
  |                                                                                                                             
  |===========================                                                                                            |  22%
  |                                                                                                                             
  |===========================                                                                                            |  23%
  |                                                                                                                             
  |============================                                                                                           |  23%
  |                                                                                                                             
  |============================                                                                                           |  24%
  |                                                                                                                             
  |=============================                                                                                          |  24%
  |                                                                                                                             
  |=============================                                                                                          |  25%
  |                                                                                                                             
  |==============================                                                                                         |  25%
  |                                                                                                                             
  |==============================                                                                                         |  26%
  |                                                                                                                             
  |===============================                                                                                        |  26%
  |                                                                                                                             
  |================================                                                                                       |  26%
  |                                                                                                                             
  |================================                                                                                       |  27%
  |                                                                                                                             
  |=================================                                                                                      |  27%
  |                                                                                                                             
  |=================================                                                                                      |  28%
  |                                                                                                                             
  |==================================                                                                                     |  28%
  |                                                                                                                             
  |==================================                                                                                     |  29%
  |                                                                                                                             
  |===================================                                                                                    |  29%
  |                                                                                                                             
  |===================================                                                                                    |  30%
  |                                                                                                                             
  |====================================                                                                                   |  30%
  |                                                                                                                             
  |====================================                                                                                   |  31%
  |                                                                                                                             
  |=====================================                                                                                  |  31%
  |                                                                                                                             
  |=====================================                                                                                  |  32%
  |                                                                                                                             
  |======================================                                                                                 |  32%
  |                                                                                                                             
  |=======================================                                                                                |  32%
  |                                                                                                                             
  |=======================================                                                                                |  33%
  |                                                                                                                             
  |========================================                                                                               |  33%
  |                                                                                                                             
  |========================================                                                                               |  34%
  |                                                                                                                             
  |=========================================                                                                              |  34%
  |                                                                                                                             
  |=========================================                                                                              |  35%
  |                                                                                                                             
  |==========================================                                                                             |  35%
  |                                                                                                                             
  |==========================================                                                                             |  36%
  |                                                                                                                             
  |===========================================                                                                            |  36%
  |                                                                                                                             
  |===========================================                                                                            |  37%
  |                                                                                                                             
  |============================================                                                                           |  37%
  |                                                                                                                             
  |=============================================                                                                          |  37%
  |                                                                                                                             
  |=============================================                                                                          |  38%
  |                                                                                                                             
  |==============================================                                                                         |  38%
  |                                                                                                                             
  |==============================================                                                                         |  39%
  |                                                                                                                             
  |===============================================                                                                        |  39%
  |                                                                                                                             
  |===============================================                                                                        |  40%
  |                                                                                                                             
  |================================================                                                                       |  40%
  |                                                                                                                             
  |================================================                                                                       |  41%
  |                                                                                                                             
  |=================================================                                                                      |  41%
  |                                                                                                                             
  |=================================================                                                                      |  42%
  |                                                                                                                             
  |==================================================                                                                     |  42%
  |                                                                                                                             
  |===================================================                                                                    |  42%
  |                                                                                                                             
  |===================================================                                                                    |  43%
  |                                                                                                                             
  |====================================================                                                                   |  43%
  |                                                                                                                             
  |====================================================                                                                   |  44%
  |                                                                                                                             
  |=====================================================                                                                  |  44%
  |                                                                                                                             
  |=====================================================                                                                  |  45%
  |                                                                                                                             
  |======================================================                                                                 |  45%
  |                                                                                                                             
  |======================================================                                                                 |  46%
  |                                                                                                                             
  |=======================================================                                                                |  46%
  |                                                                                                                             
  |=======================================================                                                                |  47%
  |                                                                                                                             
  |========================================================                                                               |  47%
  |                                                                                                                             
  |=========================================================                                                              |  48%
  |                                                                                                                             
  |==========================================================                                                             |  48%
  |                                                                                                                             
  |==========================================================                                                             |  49%
  |                                                                                                                             
  |===========================================================                                                            |  49%
  |                                                                                                                             
  |===========================================================                                                            |  50%
  |                                                                                                                             
  |============================================================                                                           |  50%
  |                                                                                                                             
  |============================================================                                                           |  51%
  |                                                                                                                             
  |=============================================================                                                          |  51%
  |                                                                                                                             
  |=============================================================                                                          |  52%
  |                                                                                                                             
  |==============================================================                                                         |  52%
  |                                                                                                                             
  |===============================================================                                                        |  53%
  |                                                                                                                             
  |================================================================                                                       |  53%
  |                                                                                                                             
  |================================================================                                                       |  54%
  |                                                                                                                             
  |=================================================================                                                      |  54%
  |                                                                                                                             
  |=================================================================                                                      |  55%
  |                                                                                                                             
  |==================================================================                                                     |  55%
  |                                                                                                                             
  |==================================================================                                                     |  56%
  |                                                                                                                             
  |===================================================================                                                    |  56%
  |                                                                                                                             
  |===================================================================                                                    |  57%
  |                                                                                                                             
  |====================================================================                                                   |  57%
  |                                                                                                                             
  |====================================================================                                                   |  58%
  |                                                                                                                             
  |=====================================================================                                                  |  58%
  |                                                                                                                             
  |======================================================================                                                 |  58%
  |                                                                                                                             
  |======================================================================                                                 |  59%
  |                                                                                                                             
  |=======================================================================                                                |  59%
  |                                                                                                                             
  |=======================================================================                                                |  60%
  |                                                                                                                             
  |========================================================================                                               |  60%
  |                                                                                                                             
  |========================================================================                                               |  61%
  |                                                                                                                             
  |=========================================================================                                              |  61%
  |                                                                                                                             
  |=========================================================================                                              |  62%
  |                                                                                                                             
  |==========================================================================                                             |  62%
  |                                                                                                                             
  |==========================================================================                                             |  63%
  |                                                                                                                             
  |===========================================================================                                            |  63%
  |                                                                                                                             
  |============================================================================                                           |  63%
  |                                                                                                                             
  |============================================================================                                           |  64%
  |                                                                                                                             
  |=============================================================================                                          |  64%
  |                                                                                                                             
  |=============================================================================                                          |  65%
  |                                                                                                                             
  |==============================================================================                                         |  65%
  |                                                                                                                             
  |==============================================================================                                         |  66%
  |                                                                                                                             
  |===============================================================================                                        |  66%
  |                                                                                                                             
  |===============================================================================                                        |  67%
  |                                                                                                                             
  |================================================================================                                       |  67%
  |                                                                                                                             
  |================================================================================                                       |  68%
  |                                                                                                                             
  |=================================================================================                                      |  68%
  |                                                                                                                             
  |==================================================================================                                     |  68%
  |                                                                                                                             
  |==================================================================================                                     |  69%
  |                                                                                                                             
  |===================================================================================                                    |  69%
  |                                                                                                                             
  |===================================================================================                                    |  70%
  |                                                                                                                             
  |====================================================================================                                   |  70%
  |                                                                                                                             
  |====================================================================================                                   |  71%
  |                                                                                                                             
  |=====================================================================================                                  |  71%
  |                                                                                                                             
  |=====================================================================================                                  |  72%
  |                                                                                                                             
  |======================================================================================                                 |  72%
  |                                                                                                                             
  |======================================================================================                                 |  73%
  |                                                                                                                             
  |=======================================================================================                                |  73%
  |                                                                                                                             
  |=======================================================================================                                |  74%
  |                                                                                                                             
  |========================================================================================                               |  74%
  |                                                                                                                             
  |=========================================================================================                              |  74%
  |                                                                                                                             
  |=========================================================================================                              |  75%
  |                                                                                                                             
  |==========================================================================================                             |  75%
  |                                                                                                                             
  |==========================================================================================                             |  76%
  |                                                                                                                             
  |===========================================================================================                            |  76%
  |                                                                                                                             
  |===========================================================================================                            |  77%
  |                                                                                                                             
  |============================================================================================                           |  77%
  |                                                                                                                             
  |============================================================================================                           |  78%
  |                                                                                                                             
  |=============================================================================================                          |  78%
  |                                                                                                                             
  |=============================================================================================                          |  79%
  |                                                                                                                             
  |==============================================================================================                         |  79%
  |                                                                                                                             
  |===============================================================================================                        |  79%
  |                                                                                                                             
  |===============================================================================================                        |  80%
  |                                                                                                                             
  |================================================================================================                       |  80%
  |                                                                                                                             
  |================================================================================================                       |  81%
  |                                                                                                                             
  |=================================================================================================                      |  81%
  |                                                                                                                             
  |=================================================================================================                      |  82%
  |                                                                                                                             
  |==================================================================================================                     |  82%
  |                                                                                                                             
  |==================================================================================================                     |  83%
  |                                                                                                                             
  |===================================================================================================                    |  83%
  |                                                                                                                             
  |===================================================================================================                    |  84%
  |                                                                                                                             
  |====================================================================================================                   |  84%
  |                                                                                                                             
  |=====================================================================================================                  |  84%
  |                                                                                                                             
  |=====================================================================================================                  |  85%
  |                                                                                                                             
  |======================================================================================================                 |  85%
  |                                                                                                                             
  |======================================================================================================                 |  86%
  |                                                                                                                             
  |=======================================================================================================                |  86%
  |                                                                                                                             
  |=======================================================================================================                |  87%
  |                                                                                                                             
  |========================================================================================================               |  87%
  |                                                                                                                             
  |========================================================================================================               |  88%
  |                                                                                                                             
  |=========================================================================================================              |  88%
  |                                                                                                                             
  |=========================================================================================================              |  89%
  |                                                                                                                             
  |==========================================================================================================             |  89%
  |                                                                                                                             
  |===========================================================================================================            |  90%
  |                                                                                                                             
  |============================================================================================================           |  90%
  |                                                                                                                             
  |============================================================================================================           |  91%
  |                                                                                                                             
  |=============================================================================================================          |  91%
  |                                                                                                                             
  |=============================================================================================================          |  92%
  |                                                                                                                             
  |==============================================================================================================         |  92%
  |                                                                                                                             
  |==============================================================================================================         |  93%
  |                                                                                                                             
  |===============================================================================================================        |  93%
  |                                                                                                                             
  |===============================================================================================================        |  94%
  |                                                                                                                             
  |================================================================================================================       |  94%
  |                                                                                                                             
  |================================================================================================================       |  95%
  |                                                                                                                             
  |=================================================================================================================      |  95%
  |                                                                                                                             
  |==================================================================================================================     |  95%
  |                                                                                                                             
  |==================================================================================================================     |  96%
  |                                                                                                                             
  |===================================================================================================================    |  96%
  |                                                                                                                             
  |===================================================================================================================    |  97%
  |                                                                                                                             
  |====================================================================================================================   |  97%
  |                                                                                                                             
  |====================================================================================================================   |  98%
  |                                                                                                                             
  |=====================================================================================================================  |  98%
  |                                                                                                                             
  |=====================================================================================================================  |  99%
  |                                                                                                                             
  |====================================================================================================================== |  99%
  |                                                                                                                             
  |====================================================================================================================== | 100%
  |                                                                                                                             
  |=======================================================================================================================| 100%

  |                                                                                                                             
  |                                                                                                                       |   0%
  |                                                                                                                             
  |========================================                                                                               |  33%
  |                                                                                                                             
  |===============================================================================                                        |  67%
  |                                                                                                                             
  |=======================================================================================================================| 100%
healthy <- RunPCA(healthy, npcs = 50)
ElbowPlot(healthy, ndims = 50)


## Harmony (YOUR PC analysis = 1:20)
healthy <- RunHarmony(healthy, 
                      group.by.vars = "dataset", 
                      dims.use = 1:20,  # Your TEST1/2 + elbow safety
                      max_iter = 20,
                      plot_convergence = TRUE)
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|

## UMAP + Clustering
healthy <- RunUMAP(healthy, reduction = "harmony", dims = 1:20)
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
healthy <- FindNeighbors(healthy, reduction = "harmony", dims = 1:20)
healthy <- FindClusters(healthy, resolution = c(0.3, 0.5, 0.8))
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 21834
Number of edges: 745395

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9304
Number of communities: 17
Elapsed time: 3 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 21834
Number of edges: 745395

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9018
Number of communities: 20
Elapsed time: 2 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 21834
Number of edges: 745395

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8668
Number of communities: 21
Elapsed time: 2 seconds
# Batch mixing check
# Batch mixing validation (CORRECTED)
p1 <- DimPlot(healthy, group.by = "dataset", label = FALSE) + 
  ggtitle("Harmony Batch Correction")

p2 <- DimPlot(healthy, group.by = "seurat_clusters", label = TRUE) +  # No resolution here
  ggtitle("Clusters (current res)")

p3 <- DimPlot(healthy, group.by = "predicted.celltype.l1", label = TRUE) +  # No resolution here
  ggtitle("Azimuth")

p4 <- DimPlot(healthy, group.by = "predicted.celltype.l2", label = TRUE) +  # No resolution here
  ggtitle("Azimuth")

p5 <- DimPlot(healthy, group.by = "predicted.celltype.l3", label = TRUE) +  # No resolution here
  ggtitle("Azimuth")

p1 | p2 | p3 | p4 | p5 


# Save intermediate checkpoint
saveRDS(healthy, "healthy_pre_azimuth.rds")

# Re-run safe anytime
healthy <- readRDS("healthy_pre_azimuth.rds")

9 AZIMUTH ANNOTATION

options(future.globals.maxSize = 1e9)

library(SeuratData)

DefaultAssay(healthy) <- "RNA"

healthy <- RunAzimuth(healthy, reference = "pbmcref")



DimPlot(healthy, group.by = "predicted.celltype.l1", label = TRUE, 
        repel = TRUE, ncol = 2, label.size = 3) + NoLegend() +
  ggtitle("Azimuth Cell Types")


DimPlot(healthy, group.by = "predicted.celltype.l2", label = TRUE, 
        repel = TRUE, ncol = 2, label.size = 3) + NoLegend() +
  ggtitle("Azimuth Cell Types")


DimPlot(healthy, group.by = "predicted.celltype.l3", label = TRUE, 
        repel = TRUE, ncol = 2, label.size = 3) + NoLegend() +
  ggtitle("Azimuth Cell Types")

# Cell type table
table(healthy$predicted.celltype, healthy$dataset)

10 Immune cell reference

 # make sure you are on Seurat >= 5
DefaultAssay(ctrl) <- "RNA"

# merge all RNA layers into one
ctrl <- JoinLayers(ctrl, assay = "RNA")

# now convert to SCE
sce <- as.SingleCellExperiment(ctrl, assay = "RNA")

immune = celldex::DatabaseImmuneCellExpressionData()
singler.immune <- SingleR(test = sce, ref = immune, assay.type.test=1,
    labels = immune$label.fine)

head(singler.immune)

11 HPCA reference

hpca <- celldex::HumanPrimaryCellAtlasData()
singler.hpca <- SingleR(test = sce, ref = hpca, assay.type.test=1,
    labels = hpca$label.fine)

head(singler.hpca)

12 AZIMUTH ANNOTATION

DimPlot(ctrl, group.by = c("singler.hpca", "singler.immune"), ncol = 2, label = T, label.box = T, repel = T)

13 HARMONY INTEGRATION + UMAP

```

LS0tCnRpdGxlOiAiUEJNQyBjb250cm9scyAoTWFsZSBDSVRFLXNlcSArIEZlbWFsZSBpbnRyb25pYykgbWVyZ2VkIHdpdGggQ0Q0VF9sYWIiCnN1YnRpdGxlOiAiTWFsZTI3IENJVEUtc2VxIHwgRmVtYWxlMjUgSW50cm9uaWMgfCBDRDRUX2xhYiIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY3NzOiBzdHlsZS5jc3MKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogdHJ1ZQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgoKCiMgTG9hZCBsaWJyYXJpZXMKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBmaWcud2lkdGggPSAxMiwgZmlnLmhlaWdodCA9IDgpCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHNjUmVwZXJ0b2lyZSkKc2V0LnNlZWQoMTIzKQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gRkFMU0UpCgpgYGAKCgojIFN0ZXAgMTogTG9hZCBEYXRhc2V0cyAoQ0Q0VF8xMHggTmFtaW5nKQoKIyMgQ0Q0VF8xMHhfUzEgKE1hbGUgQ0lURS1zZXEpCmBgYHtyfQoKIyBMb2FkIENJVEUtc2VxIEg1IGZpbGUKbWFsZV9saXN0IDwtIFJlYWQxMFhfaDUoCiAgIk5vcm1hbF9QQk1DX1NhbXBsZXMtMjMtMDItMjAyNi8xMHhfc2FtcGxlMV9TYW1lX1BCTUNfMTB4X2luY3VkaW5nQ0lURVNFUV9UQ1JfTWFsZTI3L3NjNXBfdjJfaHNfUEJNQ18xMGtfbXVsdGlfNWdleF81ZmJfYl90X2NvdW50X2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4Lmg1IiwKICB1c2UubmFtZXMgPSBUUlVFCikKbmFtZXMobWFsZV9saXN0KQoKY2Q0dF9zMSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoCiAgY291bnRzID0gbWFsZV9saXN0W1siR2VuZSBFeHByZXNzaW9uIl1dLAogIHByb2plY3QgPSAiQ0Q0VF8xMHhfUzEiLAogIG1pbi5jZWxscyA9IDMsIG1pbi5mZWF0dXJlcyA9IDIwMAopCgphZHRfY291bnRzIDwtIG1hbGVfbGlzdFtbIkFudGlib2R5IENhcHR1cmUiXV1bLCBjb2xuYW1lcyhjZDR0X3MxKV0Kcm93bmFtZXMoYWR0X2NvdW50cykgPC0gZ3N1YigiXyIsICItIiwgcm93bmFtZXMoYWR0X2NvdW50cykpCmNkNHRfczFbWyJBRFQiXV0gPC0gQ3JlYXRlQXNzYXk1T2JqZWN0KGNvdW50cyA9IGFkdF9jb3VudHMpCgpjZDR0X3MxJGRhdGFzZXQgPC0gIkNENFRfMTB4X1MxIgpjZDR0X3MxCmBgYAoKCiMjIENENFRfMTB4X1MyIChGZW1hbGUgSW50cm9uaWMpCmBgYHtyfQpmZW1hbGVfZGF0YSA8LSBSZWFkMTBYX2g1KAogICJOb3JtYWxfUEJNQ19TYW1wbGVzLTIzLTAyLTIwMjYvMTB4X3NhbXBsZTJfVENSX2F2YWlsYWJsZV9GZW1hbGUyNS0zMC8xMGtfUEJNQ181cHYyX25leHRnZW1fQ2hyb21pdW1fWF9pbnRyb25fMTBrX1BCTUNfNXB2Ml9uZXh0Z2VtX0Nocm9taXVtX1hfaW50cm9uX2NvdW50X3NhbXBsZV9mZWF0dXJlX2JjX21hdHJpeC5oNSIsCiAgdXNlLm5hbWVzID0gVFJVRQopCgpjb3VudHNfbWF0cml4IDwtIGlmKGlzLmxpc3QoZmVtYWxlX2RhdGEpICYmIGxlbmd0aChmZW1hbGVfZGF0YSk+MCkgZmVtYWxlX2RhdGFbWzFdXSBlbHNlIGZlbWFsZV9kYXRhCgpjZDR0X3MyIDwtIENyZWF0ZVNldXJhdE9iamVjdCgKICBjb3VudHMgPSBjb3VudHNfbWF0cml4LAogIHByb2plY3QgPSAiQ0Q0VF8xMHhfUzIiLAogIG1pbi5jZWxscyA9IDMsIG1pbi5mZWF0dXJlcyA9IDIwMAopCmNkNHRfczIkZGF0YXNldCA8LSAiQ0Q0VF8xMHhfUzIiCmNkNHRfczIKCmBgYAoKCiMjIFlvdXIgQ0Q0VF9sYWIgKHN1YnNldCBmcm9tIHNlemFyeV9vYmopCmBgYHtyfQpBbGxfc2FtcGxlc19NZXJnZWQgPC0gcmVhZFJEUygKICAiL2hvbWUvYmlvaW5mby8xLVRoZXNpc19GaW5hbF9ZZWFyXzIwMjUvMjAyNS1ZZWFyM19BbmFseXNpcy8xLXNjUk5BX1JFU1VMVFMtMTktMTEtMjAyNS8wLVNldXJhdF9SRFNfRmluYWxfT0JKRUNUL0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1JlbmFtZWRfQ2x1c3RlcnNfZmluYWwtMjYtMTAtMjAyNS5yZHMiCikKCmNkNHRfbGFiIDwtIHN1YnNldChBbGxfc2FtcGxlc19NZXJnZWQsIHN1YnNldCA9IG9yaWcuaWRlbnQgPT0gIkNENFRfbGFiIikKY2Q0dF9sYWIkZGF0YXNldCA8LSAiQ0Q0VF9sYWIiCkRlZmF1bHRBc3NheShjZDR0X2xhYikgPC0gIlJOQSIKY2Q0dF9sYWIKYGBgCgoKIyBRdWFsaXR5IENvbnRyb2wgRnVuY3Rpb25zCmBgYHtyfQpjb21wdXRlX3FjIDwtIGZ1bmN0aW9uKG9iaikgewogIERlZmF1bHRBc3NheShvYmopIDwtICJSTkEiCiAgb2JqW1sicGVyY2VudC5tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChvYmosIHBhdHRlcm4gPSAiXk1ULSIpCiAgb2JqJHBlcmNlbnQubXQgPC0gcmVwbGFjZShhcy5udW1lcmljKG9iaiRwZXJjZW50Lm10KSwgaXMubmEob2JqJHBlcmNlbnQubXQpLCAwKQogIG9iagp9CgpjZDR0X3MxIDwtIGNvbXB1dGVfcWMoY2Q0dF9zMSkKY2Q0dF9zMiA8LSBjb21wdXRlX3FjKGNkNHRfczIpCmNkNHRfbGFiIDwtIGNvbXB1dGVfcWMoY2Q0dF9sYWIpCgpgYGAKCiMjIFByZS1maWx0ZXIgUUMgUGxvdHMKYGBge3IsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD00fQpwcmVfcWMgPC0gbWVyZ2UoY2Q0dF9zMSwgeSA9IGxpc3QoY2Q0dF9zMiwgY2Q0dF9sYWIpKQpWbG5QbG90KHByZV9xYywgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIAogICAgICAgIGdyb3VwLmJ5ID0gImRhdGFzZXQiLCBwdC5zaXplID0gMCwgbmNvbCA9IDMpCgpwMSA8LSBGZWF0dXJlU2NhdHRlcihwcmVfcWMsICJuQ291bnRfUk5BIiwgIm5GZWF0dXJlX1JOQSIsIGdyb3VwLmJ5ID0gImRhdGFzZXQiKQpwMiA8LSBGZWF0dXJlU2NhdHRlcihwcmVfcWMsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiLCBncm91cC5ieSA9ICJkYXRhc2V0IikKcDMgPC0gRmVhdHVyZVNjYXR0ZXIocHJlX3FjLCAibkZlYXR1cmVfUk5BIiwgInBlcmNlbnQubXQiLCBncm91cC5ieSA9ICJkYXRhc2V0IikKcDEgfCBwMiB8IHAzCgpgYGAKCgojIyBZT1VSIEV4YWN0IEZpbHRlcmluZyBQYXJhbWV0ZXJzCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KIyBZb3VyIFNlemFyeSBTeW5kcm9tZSBmaWx0ZXJpbmcgKGV4YWN0KQp5b3VyX2ZpbHRlciA8LSBmdW5jdGlvbihvYmopIHsKICBzdWJzZXQob2JqLCBzdWJzZXQgPSAKICAgIG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5GZWF0dXJlX1JOQSA8IDcwMDAgJiAKICAgIG5Db3VudF9STkEgPCA0MDAwMCAmIHBlcmNlbnQubXQgPCA3LjUgJiBwZXJjZW50Lm10ID4gMC4xCiAgKQp9CgpjZDR0X3MxIDwtIHlvdXJfZmlsdGVyKGNkNHRfczEpCmNkNHRfczIgPC0geW91cl9maWx0ZXIoY2Q0dF9zMikKY2Q0dF9sYWIgPC0geW91cl9maWx0ZXIoY2Q0dF9sYWIpCgpjYXQoIj09PSBDRUxMUyBBRlRFUiBZT1VSIEZJTFRFUklORyA9PT1cbiIpCmNhdCgiQ0Q0VF8xMHhfUzE6IiwgbmNvbChjZDR0X3MxKSwgIlxuIikKY2F0KCJDRDRUXzEweF9TMjoiLCBuY29sKGNkNHRfczIpLCAiXG4iKQpjYXQoIkNENFRfbGFiOiAgIiwgbmNvbChjZDR0X2xhYiksICJcbiIpCgpgYGAKCgoKIyMgUG9zdC1maWx0ZXIgUUMKYGBge3IsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQpwb3N0X3FjIDwtIG1lcmdlKGNkNHRfczEsIHkgPSBsaXN0KGNkNHRfczIsIGNkNHRfbGFiKSkKVmxuUGxvdChwb3N0X3FjLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsIm5Db3VudF9STkEiLCJwZXJjZW50Lm10IiksIAogICAgICAgIGdyb3VwLmJ5ID0gImRhdGFzZXQiLCBuY29sID0gMywgcHQuc2l6ZSA9IDApCgpgYGAKCgojIE5vcm1hbGl6YXRpb24gKEluZGl2aWR1YWwg4oaSIEhhcm1vbnkpCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KY2F0KCI9PT0gQ09NUExFVEUgTk9STUFMSVpBVElPTiAoUzEvUzIvTGFiICsgRHVtbXkgQURUKSA9PT1cbiIpCgojIDEuIFJOQSBOb3JtYWxpemF0aW9uIChBTEwgMyBzYW1wbGVzKQpjZDR0X3MxIDwtIE5vcm1hbGl6ZURhdGEoY2Q0dF9zMSwgdmVyYm9zZSA9IEZBTFNFKTsgY2F0KCLinIUgUk5BIFMxXG4iKQpjZDR0X3MyIDwtIE5vcm1hbGl6ZURhdGEoY2Q0dF9zMiwgdmVyYm9zZSA9IEZBTFNFKTsgY2F0KCLinIUgUk5BIFMyXG4iKQpjZDR0X2xhYiA8LSBOb3JtYWxpemVEYXRhKGNkNHRfbGFiLCB2ZXJib3NlID0gRkFMU0UpOyBjYXQoIuKchSBSTkEgTGFiXG4iKQoKIyAyLiBVbml2ZXJzYWwgQURUIE5vcm1hbGl6YXRpb24gKFJlYWwgKyBEdW1teSkKbm9ybWFsaXplX2FsbF9hZHQgPC0gZnVuY3Rpb24oKSB7CiAgZm9yKHNhbXBsZV9uYW1lIGluIGMoImNkNHRfczEiLCAiY2Q0dF9zMiIsICJjZDR0X2xhYiIpKSB7CiAgICBvYmogPC0gZ2V0KHNhbXBsZV9uYW1lKQogICAgCiAgICAjIEFsbCBub3cgaGF2ZSBBRFQgKHJlYWwgb3IgZHVtbXkpIOKckwogICAgaWYoIkFEVCIgJWluJSBuYW1lcyhvYmpAYXNzYXlzKSkgewogICAgICBjYXQoIkFEVCBub3JtYWxpemluZzoiLCBzYW1wbGVfbmFtZSwgIlxuIikKICAgICAgRGVmYXVsdEFzc2F5KG9iaikgPC0gIkFEVCIKICAgICAgb2JqIDwtIE5vcm1hbGl6ZURhdGEob2JqLCBub3JtYWxpemF0aW9uLm1ldGhvZCA9ICJDTFIiLCBtYXJnaW4gPSAyLCB2ZXJib3NlID0gRkFMU0UpCiAgICAgIGNhdCgiICDihpIiLCBzYW1wbGVfbmFtZSwgIkFEVCBDTFIg4pyTXG4iKQogICAgfQogICAgCiAgICAjIEFsd2F5cyByZXNldCB0byBSTkEKICAgIERlZmF1bHRBc3NheShvYmopIDwtICJSTkEiCiAgICBhc3NpZ24oc2FtcGxlX25hbWUsIG9iaiwgZW52aXIgPSAuR2xvYmFsRW52KQogIH0KfQoKbm9ybWFsaXplX2FsbF9hZHQoKQpjYXQoIlxu8J+OryBBTEwgTk9STUFMSVpFRCDihpIgUkVBRFkgRk9SIEhBUk1PTlkhXG4iKQoKIyBRdWljayB2ZXJpZmljYXRpb24KY2F0KCJcbkFjdGl2ZSBhc3NheXM6XG4iKQpjYXQoIlMxOiAiLCBEZWZhdWx0QXNzYXkoY2Q0dF9zMSksICJcbiIpCmNhdCgiUzI6ICIsIERlZmF1bHRBc3NheShjZDR0X3MyKSwgIlxuIikgCmNhdCgiTGFiOiIsIERlZmF1bHRBc3NheShjZDR0X2xhYiksICJcbiIpCmBgYAoKIyMgRklYRUQgU2V1cmF0IHY1IFNjcmlwdCAoTm8gSW50ZXJuYWwgRnVuY3Rpb25zKQpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9CgojIOKchSAxLiBTZXVyYXQgdjUgZ2xvYmFsIG9wdGlvbiAoc2FmZSkKb3B0aW9ucyhTZXVyYXQub2JqZWN0LmFzc2F5LnZlcnNpb24gPSAidjUiKQoKIyDinIUgMi4gVW5pdmVyc2FsIFY1IGNvbnZlcnRlciAocHJvZHVjdGlvbi1yZWFkeSkKY29udmVydF90b192NSA8LSBmdW5jdGlvbihvYmosIGFzc2F5X25hbWUgPSAiQURUIikgewogIGlmKGFzc2F5X25hbWUgJWluJSBuYW1lcyhvYmpAYXNzYXlzKSkgewogICAgIyBDb252ZXJ0IGxlZ2FjeSBBc3NheSDihpIgQXNzYXk1CiAgICBpZighaW5oZXJpdHMob2JqW1thc3NheV9uYW1lXV0sICJBc3NheTUiKSkgewogICAgICBjYXQoIkNvbnZlcnRpbmciLCBhc3NheV9uYW1lLCAidG8gdjUuLi5cbiIpCiAgICAgIG9sZF9hc3NheSA8LSBvYmpbW2Fzc2F5X25hbWVdXQogICAgICBuZXdfYXNzYXkgPC0gQ3JlYXRlQXNzYXk1T2JqZWN0KGNvdW50cyA9IG9sZF9hc3NheUBjb3VudHMpCiAgICAgIG9ialtbYXNzYXlfbmFtZV1dIDwtIG5ld19hc3NheQogICAgfQogIH0gZWxzZSB7CiAgICAjIEFkZCBkdW1teSBBRFQgaWYgbWlzc2luZyAoVjUgc3RhbmRhcmQpCiAgICBjYXQoIkFkZGluZyBkdW1teSBBRFQgKHY1KS4uLlxuIikKICAgIGR1bW15IDwtIE1hdHJpeDo6TWF0cml4KDAsIG5yb3cgPSAyOCwgbmNvbCA9IG5jb2wob2JqKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KHBhc3RlMCgiRHVtbXlfQURUXyIsIDE6MjgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xuYW1lcyhvYmopKSkKICAgIG9ialtbIkFEVCJdXSA8LSBDcmVhdGVBc3NheTVPYmplY3QoY291bnRzID0gZHVtbXkpCiAgfQogIHJldHVybihvYmopCn0KCiMg4pyFIDMuIENvbnZlcnQgQUxMIHNhbXBsZXMKY2Q0dF9zMSA8LSBjb252ZXJ0X3RvX3Y1KGNkNHRfczEpOyAgIGNhdCgiUzEg4pyTXG4iKQpjZDR0X3MyIDwtIGNvbnZlcnRfdG9fdjUoY2Q0dF9zMik7ICAgY2F0KCJTMiDinJNcbiIpICAjIEdldHMgZHVtbXkKY2Q0dF9sYWIgPC0gY29udmVydF90b192NShjZDR0X2xhYik7IGNhdCgiTGFiIOKck1xuIikKCmNhdCgiXG7inIUgQUxMIE9CSkVDVFMgTk9XIFNFVVJBVCBWNSFcbiIpCmBgYAojIFBVUkUgVjUgQURUIFZlcmlmaWNhdGlvbgpgYGB7cn0KIyBTZXVyYXQgdjUgTGF5ZXJEYXRhICh1bml2ZXJzYWwgYWNjZXNzKQpmb3IobmFtZSBpbiBjKCJjZDR0X3MxIiwgImNkNHRfczIiLCAiY2Q0dF9sYWIiKSkgewogIG9iaiA8LSBnZXQobmFtZSkKICBhZHRfY291bnRzIDwtIExheWVyRGF0YShvYmpbWyJBRFQiXV0sIGxheWVyID0gImNvdW50cyIpCiAgCiAgY2F0KCJcbiIsIG5hbWUsICItIEFEVDoiLCBucm93KGFkdF9jb3VudHMpLCAiw5ciLCBuY29sKGFkdF9jb3VudHMpLCAiXG4iKQogIHRvdGFsIDwtIHN1bShhZHRfY291bnRzKQogIGNhdCgiICBTdW06IiwgdG90YWwsIGlmZWxzZSh0b3RhbD09MCwgIkRVTU1ZIOKckyIsICJSRUFMIOKckyIpLCAiXG4iKQp9CgpgYGAKCgoKCiMgSGFybW9ueSBJbnRlZ3JhdGlvbiAoRml4ZWQgTWVyZ2UpCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0KIyBGSVhFRDogUHJvcGVyIG9iamVjdCBuYW1lcyArIGNlbGwgSURzCmhlYWx0aHkgPC0gbWVyZ2UoY2Q0dF9zMSwgeSA9IGxpc3QoY2Q0dF9zMiwgY2Q0dF9sYWIpLAogICAgICAgICAgICAgICAgIGFkZC5jZWxsLmlkcyA9IGMoIkNENFRfMTB4X1MxIiwgIkNENFRfMTB4X1MyIiwgIkNENFRfbGFiIiksCiAgICAgICAgICAgICAgICAgbWVyZ2UuZGF0YSA9IEZBTFNFKQoKRGVmYXVsdEFzc2F5KGhlYWx0aHkpIDwtICJSTkEiCgojIFByZXByb2Nlc3NpbmcKaGVhbHRoeSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhoZWFsdGh5LCBuZmVhdHVyZXMgPSAzMDAwKQpoZWFsdGh5IDwtIFNjYWxlRGF0YShoZWFsdGh5LCB2YXJzLnRvLnJlZ3Jlc3MgPSAicGVyY2VudC5tdCIpCmhlYWx0aHkgPC0gUnVuUENBKGhlYWx0aHksIG5wY3MgPSA1MCkKCkVsYm93UGxvdChoZWFsdGh5LCBuZGltcyA9IDUwKQpgYGAKCgoKCgojIyBQZXJmb3JtIFBDQSBURVNUCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAgCgojIEFzc3VtaW5nIHlvdSBoYXZlIDEwIGRpZmZlcmVudCBjZWxsIGxpbmVzLCBnZW5lcmF0aW5nIGEgY29sb3IgcGFsZXR0ZSB3aXRoIDEwIGNvbG9ycwpjZWxsX2xpbmVfY29sb3JzIDwtIGJyZXdlci5wYWwoMTAsICJTZXQzIikKCiMgQXNzdW1pbmcgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSBpcyBhIGZhY3RvciBvciBjaGFyYWN0ZXIgdmVjdG9yIGNvbnRhaW5pbmcgY2VsbCBsaW5lIG5hbWVzCmRhdGEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShoZWFsdGh5JGRhdGFzZXQpKQpjb2xuYW1lcyhkYXRhKSA8LSBjKCJjZWxsX2xpbmUiLCAiblVNSSIpICAjIENoYW5nZSBjb2x1bW4gbmFtZSB0byBuVU1JCgpuY2VsbHMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gY2VsbF9saW5lLCB5ID0gblVNSSwgZmlsbCA9IGNlbGxfbGluZSkpICsgCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gblVNSSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjZWxsX2xpbmVfY29sb3JzKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgICMgQWRqdXN0IHRoZSB0aXRsZSBwb3NpdGlvbgogIGdndGl0bGUoIkZpbHRlcmVkIGNlbGxzIHBlciBzYW1wbGUiKSArCiAgeGxhYigiUEJNQyBzYW1wbGVzIikgKyAgIyBBZGp1c3QgeC1heGlzIGxhYmVsCiAgeWxhYigiRnJlcXVlbmN5IikgICAgIyBBZGp1c3QgeS1heGlzIGxhYmVsCgpwcmludChuY2VsbHMpCgpgYGAKCgoKIyBBZHZhbmNlZCBQQyBTZWxlY3Rpb24gKE9wdGlvbmFsKQpgYGB7cn0KIyBURVNULTEKIyBnaXZlbiB0aGF0IHRoZSBvdXRwdXQgb2YgUnVuUENBIGlzICJwY2EiCiMgcmVwbGFjZSAic28iIGJ5IHRoZSBuYW1lIG9mIHlvdXIgc2V1cmF0IG9iamVjdAoKcGN0IDwtIEFsbF9zYW1wbGVzX01lcmdlZFtbInBjYSJdXUBzdGRldiAvIHN1bShBbGxfc2FtcGxlc19NZXJnZWRbWyJwY2EiXV1Ac3RkZXYpICogMTAwCmN1bXUgPC0gY3Vtc3VtKHBjdCkgIyBDYWxjdWxhdGUgY3VtdWxhdGl2ZSBwZXJjZW50cyBmb3IgZWFjaCBQQwojIERldGVybWluZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZhcmlhdGlvbiBvZiBQQyBhbmQgc3Vic2VxdWVudCBQQwpjbzIgPC0gc29ydCh3aGljaCgocGN0Wy1sZW5ndGgocGN0KV0gLSBwY3RbLTFdKSA+IDAuMSksIGRlY3JlYXNpbmcgPSBUKVsxXSArIDEKIyBsYXN0IHBvaW50IHdoZXJlIGNoYW5nZSBvZiAlIG9mIHZhcmlhdGlvbiBpcyBtb3JlIHRoYW4gMC4xJS4gLT4gY28yCmNvMgoKIyBURVNULTIKIyBnZXQgc2lnbmlmaWNhbnQgUENzCnN0ZHYgPC0gQWxsX3NhbXBsZXNfTWVyZ2VkW1sicGNhIl1dQHN0ZGV2CnN1bS5zdGR2IDwtIHN1bShBbGxfc2FtcGxlc19NZXJnZWRbWyJwY2EiXV1Ac3RkZXYpCnBlcmNlbnQuc3RkdiA8LSAoc3RkdiAvIHN1bS5zdGR2KSAqIDEwMApjdW11bGF0aXZlIDwtIGN1bXN1bShwZXJjZW50LnN0ZHYpCmNvMSA8LSB3aGljaChjdW11bGF0aXZlID4gOTAgJiBwZXJjZW50LnN0ZHYgPCA1KVsxXQpjbzIgPC0gc29ydCh3aGljaCgocGVyY2VudC5zdGR2WzE6bGVuZ3RoKHBlcmNlbnQuc3RkdikgLSAxXSAtIAogICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQuc3RkdlsyOmxlbmd0aChwZXJjZW50LnN0ZHYpXSkgPiAwLjEpLCAKICAgICAgICAgICAgICBkZWNyZWFzaW5nID0gVClbMV0gKyAxCm1pbi5wYyA8LSBtaW4oY28xLCBjbzIpCm1pbi5wYwoKIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCB2YWx1ZXMKcGxvdF9kZiA8LSBkYXRhLmZyYW1lKHBjdCA9IHBlcmNlbnQuc3RkdiwgCiAgICAgICAgICAgY3VtdSA9IGN1bXVsYXRpdmUsIAogICAgICAgICAgIHJhbmsgPSAxOmxlbmd0aChwZXJjZW50LnN0ZHYpKQoKIyBFbGJvdyBwbG90IHRvIHZpc3VhbGl6ZSAKICBnZ3Bsb3QocGxvdF9kZiwgYWVzKGN1bXVsYXRpdmUsIHBlcmNlbnQuc3RkdiwgbGFiZWwgPSByYW5rLCBjb2xvciA9IHJhbmsgPiBtaW4ucGMpKSArIAogIGdlb21fdGV4dCgpICsgCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gOTAsIGNvbG9yID0gImdyZXkiKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1pbihwZXJjZW50LnN0ZHZbcGVyY2VudC5zdGR2ID4gNV0pLCBjb2xvciA9ICJncmV5IikgKwogIHRoZW1lX2J3KCkKCmBgYAoKCgoKIyBIQVJNT05ZIElOVEVHUkFUSU9OICsgVU1BUApgYGB7ciwgZmlnLndpZHRoPTIyLCBmaWcuaGVpZ2h0PTZ9CgojIyAgTWVyZ2UgKHByZXNlcnZlcyBhbGwgbm9ybWFsaXphdGlvbikKaGVhbHRoeSA8LSBtZXJnZShjZDR0X3MxLCB5ID0gbGlzdChjZDR0X3MyLCBjZDR0X2xhYiksCiAgICAgICAgICAgICAgICAgYWRkLmNlbGwuaWRzID0gYygiQ0Q0VF8xMHhfUzEiLCAiQ0Q0VF8xMHhfUzIiLCAiQ0Q0VF9sYWIiKSwKICAgICAgICAgICAgICAgICBtZXJnZS5kYXRhID0gRkFMU0UpCgojIOKchSBWNSBSRVFVSVJFRDogSm9pbiBsYXllcnMgcG9zdC1tZXJnZQpoZWFsdGh5IDwtIEpvaW5MYXllcnMoaGVhbHRoeSkKRGVmYXVsdEFzc2F5KGhlYWx0aHkpIDwtICJSTkEiCgpjYXQoIkxheWVycyBqb2luZWQ6IiwgbGVuZ3RoKGhlYWx0aHlAYXNzYXlzJFJOQUBsYXllcnMpLCAi4oaSIDEg4pyTXG4iKQoKIyMgSm9pbnQgcHJlcHJvY2Vzc2luZyAodmFyaWFibGUgZmVhdHVyZXMgYWNyb3NzIGJhdGNoZXMpCmhlYWx0aHkgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoaGVhbHRoeSwgbmZlYXR1cmVzID0gMzAwMCkKaGVhbHRoeSA8LSBTY2FsZURhdGEoaGVhbHRoeSwgdmFycy50by5yZWdyZXNzID0gInBlcmNlbnQubXQiKSAKaGVhbHRoeSA8LSBSdW5QQ0EoaGVhbHRoeSwgbnBjcyA9IDUwKQpFbGJvd1Bsb3QoaGVhbHRoeSwgbmRpbXMgPSA1MCkKCiMjIEhhcm1vbnkgKFlPVVIgUEMgYW5hbHlzaXMgPSAxOjIwKQpoZWFsdGh5IDwtIFJ1bkhhcm1vbnkoaGVhbHRoeSwgCiAgICAgICAgICAgICAgICAgICAgICBncm91cC5ieS52YXJzID0gImRhdGFzZXQiLCAKICAgICAgICAgICAgICAgICAgICAgIGRpbXMudXNlID0gMToyMCwgICMgWW91ciBURVNUMS8yICsgZWxib3cgc2FmZXR5CiAgICAgICAgICAgICAgICAgICAgICBtYXhfaXRlciA9IDIwLAogICAgICAgICAgICAgICAgICAgICAgcGxvdF9jb252ZXJnZW5jZSA9IFRSVUUpCgojIyBVTUFQICsgQ2x1c3RlcmluZwpoZWFsdGh5IDwtIFJ1blVNQVAoaGVhbHRoeSwgcmVkdWN0aW9uID0gImhhcm1vbnkiLCBkaW1zID0gMToyMCkKaGVhbHRoeSA8LSBGaW5kTmVpZ2hib3JzKGhlYWx0aHksIHJlZHVjdGlvbiA9ICJoYXJtb255IiwgZGltcyA9IDE6MjApCmhlYWx0aHkgPC0gRmluZENsdXN0ZXJzKGhlYWx0aHksIHJlc29sdXRpb24gPSBjKDAuMywgMC41LCAwLjgpKQoKIyBCYXRjaCBtaXhpbmcgY2hlY2sKIyBCYXRjaCBtaXhpbmcgdmFsaWRhdGlvbiAoQ09SUkVDVEVEKQpwMSA8LSBEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gImRhdGFzZXQiLCBsYWJlbCA9IEZBTFNFKSArIAogIGdndGl0bGUoIkhhcm1vbnkgQmF0Y2ggQ29ycmVjdGlvbiIpCgpwMiA8LSBEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gInNldXJhdF9jbHVzdGVycyIsIGxhYmVsID0gVFJVRSkgKyAgIyBObyByZXNvbHV0aW9uIGhlcmUKICBnZ3RpdGxlKCJDbHVzdGVycyAoY3VycmVudCByZXMpIikKCnAzIDwtIERpbVBsb3QoaGVhbHRoeSwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwxIiwgbGFiZWwgPSBUUlVFKSArICAjIE5vIHJlc29sdXRpb24gaGVyZQogIGdndGl0bGUoIkF6aW11dGgiKQoKcDQgPC0gRGltUGxvdChoZWFsdGh5LCBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDIiLCBsYWJlbCA9IFRSVUUpICsgICMgTm8gcmVzb2x1dGlvbiBoZXJlCiAgZ2d0aXRsZSgiQXppbXV0aCIpCgpwNSA8LSBEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMyIsIGxhYmVsID0gVFJVRSkgKyAgIyBObyByZXNvbHV0aW9uIGhlcmUKICBnZ3RpdGxlKCJBemltdXRoIikKCnAxIHwgcDIgfCBwMyB8IHA0IHwgcDUgCgojIFNhdmUgaW50ZXJtZWRpYXRlIGNoZWNrcG9pbnQKc2F2ZVJEUyhoZWFsdGh5LCAiaGVhbHRoeV9wcmVfYXppbXV0aC5yZHMiKQoKIyBSZS1ydW4gc2FmZSBhbnl0aW1lCmhlYWx0aHkgPC0gcmVhZFJEUygiaGVhbHRoeV9wcmVfYXppbXV0aC5yZHMiKQoKYGBgCgoKCgoKCiMgQVpJTVVUSCBBTk5PVEFUSU9OCmBgYHtyLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0Kb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gMWU5KQoKbGlicmFyeShTZXVyYXREYXRhKQoKRGVmYXVsdEFzc2F5KGhlYWx0aHkpIDwtICJSTkEiCgpoZWFsdGh5IDwtIFJ1bkF6aW11dGgoaGVhbHRoeSwgcmVmZXJlbmNlID0gInBibWNyZWYiKQoKCgpEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMSIsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgcmVwZWwgPSBUUlVFLCBuY29sID0gMiwgbGFiZWwuc2l6ZSA9IDMpICsgTm9MZWdlbmQoKSArCiAgZ2d0aXRsZSgiQXppbXV0aCBDZWxsIFR5cGVzIikKCgpEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMiIsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgcmVwZWwgPSBUUlVFLCBuY29sID0gMiwgbGFiZWwuc2l6ZSA9IDMpICsgTm9MZWdlbmQoKSArCiAgZ2d0aXRsZSgiQXppbXV0aCBDZWxsIFR5cGVzIikKCgpEaW1QbG90KGhlYWx0aHksIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMyIsIGxhYmVsID0gVFJVRSwgCiAgICAgICAgcmVwZWwgPSBUUlVFLCBuY29sID0gMiwgbGFiZWwuc2l6ZSA9IDMpICsgTm9MZWdlbmQoKSArCiAgZ2d0aXRsZSgiQXppbXV0aCBDZWxsIFR5cGVzIikKCiMgQ2VsbCB0eXBlIHRhYmxlCnRhYmxlKGhlYWx0aHkkcHJlZGljdGVkLmNlbGx0eXBlLCBoZWFsdGh5JGRhdGFzZXQpCgpgYGAKCgoKIyBJbW11bmUgY2VsbCByZWZlcmVuY2UKYGBge3J9CiAjIG1ha2Ugc3VyZSB5b3UgYXJlIG9uIFNldXJhdCA+PSA1CkRlZmF1bHRBc3NheShjdHJsKSA8LSAiUk5BIgoKIyBtZXJnZSBhbGwgUk5BIGxheWVycyBpbnRvIG9uZQpjdHJsIDwtIEpvaW5MYXllcnMoY3RybCwgYXNzYXkgPSAiUk5BIikKCiMgbm93IGNvbnZlcnQgdG8gU0NFCnNjZSA8LSBhcy5TaW5nbGVDZWxsRXhwZXJpbWVudChjdHJsLCBhc3NheSA9ICJSTkEiKQoKaW1tdW5lID0gY2VsbGRleDo6RGF0YWJhc2VJbW11bmVDZWxsRXhwcmVzc2lvbkRhdGEoKQpzaW5nbGVyLmltbXVuZSA8LSBTaW5nbGVSKHRlc3QgPSBzY2UsIHJlZiA9IGltbXVuZSwgYXNzYXkudHlwZS50ZXN0PTEsCiAgICBsYWJlbHMgPSBpbW11bmUkbGFiZWwuZmluZSkKCmhlYWQoc2luZ2xlci5pbW11bmUpCgoKYGBgCgoKIyAgSFBDQSByZWZlcmVuY2UKYGBge3J9CmhwY2EgPC0gY2VsbGRleDo6SHVtYW5QcmltYXJ5Q2VsbEF0bGFzRGF0YSgpCnNpbmdsZXIuaHBjYSA8LSBTaW5nbGVSKHRlc3QgPSBzY2UsIHJlZiA9IGhwY2EsIGFzc2F5LnR5cGUudGVzdD0xLAogICAgbGFiZWxzID0gaHBjYSRsYWJlbC5maW5lKQoKaGVhZChzaW5nbGVyLmhwY2EpCgoKYGBgCgoKCgoKIyBBWklNVVRIIEFOTk9UQVRJT04KYGBge3J9CkRpbVBsb3QoY3RybCwgZ3JvdXAuYnkgPSBjKCJzaW5nbGVyLmhwY2EiLCAic2luZ2xlci5pbW11bmUiKSwgbmNvbCA9IDIsIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCwgcmVwZWwgPSBUKQpgYGAKCgoKCiMgSEFSTU9OWSBJTlRFR1JBVElPTiArIFVNQVAKYGBge3J9CgoKYGBgCmBgYAoK