1. load libraries

2. Load Seurat Object


#Load Seurat Object merged from cell lines and a control(PBMC) after filtration
load("../../../0-IMP-OBJECTS/All_Samples_Merged_with_10x_Azitmuth_Annotated_SCT_HPC_without_harmony_integration.robj")

All_samples_Merged
An object of class Seurat 
64169 features across 59355 samples within 6 assays 
Active assay: SCT (27417 features, 3000 variable features)
 3 layers present: counts, data, scale.data
 5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
 4 dimensional reductions calculated: integrated_dr, ref.umap, pca, umap

3. Data PREPARATION and Harmony Integration-1

# Create a new metadata column for grouping
All_samples_Merged$sample_group <- case_when(
  grepl("^L", All_samples_Merged$cell_line) ~ "Cell_Line",
  All_samples_Merged$cell_line == "PBMC" ~ "PBMC",
  All_samples_Merged$cell_line == "PBMC_10x" ~ "PBMC_10x",
  TRUE ~ "Other"
)

# Create the cell line grouping correctly
All_samples_Merged$cell_line_group <- case_when(
  grepl("^L[1-2]", All_samples_Merged$cell_line) ~ "P1",
  grepl("^L[3-4]", All_samples_Merged$cell_line) ~ "P2",
  grepl("^L[5-7]", All_samples_Merged$cell_line) ~ "P3",
  All_samples_Merged$cell_line == "PBMC" ~ "PBMC",
  All_samples_Merged$cell_line == "PBMC_10x" ~ "PBMC_10x",
  TRUE ~ "Other"  # This catches any unexpected values
)

library(harmony)

All_samples_Merged <- RunHarmony(
  object = All_samples_Merged,
  group.by.vars = c("sample_group", "cell_line_group", "cell_line"),
  dims.use = 1:22,
  theta = c(2, 1, 0),  # Stronger correction for broader groups
  lambda = c(1, 0.8, 0.5),  # Adjust as needed
  plot_convergence = TRUE
)
Transposing data matrix
Initializing state using k-means centroids initialization
Harmony 1/10
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Harmony 2/10
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Harmony converged after 2 iterations

Harmony Visualization-1

# Print the plots
print(p1 + p2 +p3)

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "sample_group", label = TRUE, label.box = TRUE) + 
  ggtitle("Sample Group")

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line_group", label = TRUE, label.box = TRUE) + 
  ggtitle("Cell Line Group")

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line", label = TRUE, label.box = TRUE) + 
  ggtitle("Cell Line")

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "predicted.celltype.l2", label = TRUE, label.box = TRUE) + 
  ggtitle("Annotations")

Marker Gene Visualization



# Set marker genes specific to requested immune cell types
myfeatures <- c("CD19", "CD79A", "MS4A1", # B cells
                "CD14", "LYZ", "FCGR3A", # Monocytes
                "CSF1R", "CD68", # Macrophages
                "NKG7", "GNLY", "KIR3DL1", # NK cells
                "MKI67", # Proliferating NK cells
                "CD34", "KIT", # HSPCs
                "CD3E", "CCR7", # T cells
                "SELL", "CD45RO", # Tnaive, Tcm
                "CD44", "CD45RA") # Tem, Temra
# Visualize marker genes for Harmony
FeaturePlot(All_samples_Merged, features = myfeatures, reduction = "umap.harmony", ncol = 4) + 
  ggtitle("Marker Gene Expression - Harmony Integration") +
  NoLegend()
Avis : Could not find CD45RO in the default search locations, found in 'ADT' assay insteadAvis : Could not find CD45RA in the default search locations, found in 'ADT' assay instead

4. Save the Seurat object as an Robj file


save(All_samples_Merged, file = "../../../0-IMP-OBJECTS/Harmony_integrated_All_samples_Merged_with_PBMC10x_using_sampleGroup_cell_line_cell_lineGroup.Robj")
LS0tCnRpdGxlOiAiSGFybW9ueSBpbnRlZ3JhdGlvbnMgb2YgUEJNQzEweCBieSBzYW1wbGUgZ3JvdXAsIGNlbGwgbGluZSBncm91cCBhbmQgY2VsbCBsaW5lIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICNybWRmb3JtYXRzOjpyZWFkdGhlZG93bgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2NvbGxhcHNlZDogdHJ1ZQotLS0KCiMgMS4gbG9hZCBsaWJyYXJpZXMKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KFNldXJhdFdyYXBwZXJzKQpsaWJyYXJ5KFNldXJhdE9iamVjdCkKbGlicmFyeShTZXVyYXREYXRhKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShoYXJtb255KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocmV0aWN1bGF0ZSkKbGlicmFyeShBemltdXRoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFJ0c25lKQpsaWJyYXJ5KGhhcm1vbnkpCgpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLm1heFNpemUgPSAxZTkpCgpgYGAKCgoKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7ciBsb2FkX3NldXJhdH0KCiNMb2FkIFNldXJhdCBPYmplY3QgbWVyZ2VkIGZyb20gY2VsbCBsaW5lcyBhbmQgYSBjb250cm9sKFBCTUMpIGFmdGVyIGZpbHRyYXRpb24KbG9hZCgiLi4vLi4vLi4vMC1JTVAtT0JKRUNUUy9BbGxfU2FtcGxlc19NZXJnZWRfd2l0aF8xMHhfQXppdG11dGhfQW5ub3RhdGVkX1NDVF9IUENfd2l0aG91dF9oYXJtb255X2ludGVncmF0aW9uLnJvYmoiKQoKQWxsX3NhbXBsZXNfTWVyZ2VkCgpgYGAKCiMgMy4gRGF0YSBQUkVQQVJBVElPTiBhbmQgSGFybW9ueSBJbnRlZ3JhdGlvbi0xCmBgYHtyIGRhdGEsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQojIENyZWF0ZSBhIG5ldyBtZXRhZGF0YSBjb2x1bW4gZm9yIGdyb3VwaW5nCkFsbF9zYW1wbGVzX01lcmdlZCRzYW1wbGVfZ3JvdXAgPC0gY2FzZV93aGVuKAogIGdyZXBsKCJeTCIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpIH4gIkNlbGxfTGluZSIsCiAgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSA9PSAiUEJNQyIgfiAiUEJNQyIsCiAgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSA9PSAiUEJNQ18xMHgiIH4gIlBCTUNfMTB4IiwKICBUUlVFIH4gIk90aGVyIgopCgojIENyZWF0ZSB0aGUgY2VsbCBsaW5lIGdyb3VwaW5nIGNvcnJlY3RseQpBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lX2dyb3VwIDwtIGNhc2Vfd2hlbigKICBncmVwbCgiXkxbMS0yXSIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpIH4gIlAxIiwKICBncmVwbCgiXkxbMy00XSIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpIH4gIlAyIiwKICBncmVwbCgiXkxbNS03XSIsIEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpIH4gIlAzIiwKICBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lID09ICJQQk1DIiB+ICJQQk1DIiwKICBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lID09ICJQQk1DXzEweCIgfiAiUEJNQ18xMHgiLAogIFRSVUUgfiAiT3RoZXIiICAjIFRoaXMgY2F0Y2hlcyBhbnkgdW5leHBlY3RlZCB2YWx1ZXMKKQoKbGlicmFyeShoYXJtb255KQoKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFJ1bkhhcm1vbnkoCiAgb2JqZWN0ID0gQWxsX3NhbXBsZXNfTWVyZ2VkLAogIGdyb3VwLmJ5LnZhcnMgPSBjKCJzYW1wbGVfZ3JvdXAiLCAiY2VsbF9saW5lX2dyb3VwIiwgImNlbGxfbGluZSIpLAogIGRpbXMudXNlID0gMToyMiwKICB0aGV0YSA9IGMoMiwgMSwgMCksICAjIFN0cm9uZ2VyIGNvcnJlY3Rpb24gZm9yIGJyb2FkZXIgZ3JvdXBzCiAgbGFtYmRhID0gYygxLCAwLjgsIDAuNSksICAjIEFkanVzdCBhcyBuZWVkZWQKICBwbG90X2NvbnZlcmdlbmNlID0gVFJVRQopCgpgYGAKCiMjICBIYXJtb255IFZpc3VhbGl6YXRpb24tMQpgYGB7ciBoYXJtb255LXZpc3VhbGl6YXRpb24xLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgUnVuIFVNQVAgb24gdGhlIEhhcm1vbnktY29ycmVjdGVkIGRhdGEKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIFJ1blVNQVAoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIGRpbXMgPSAxOjIyLCByZWR1Y3Rpb24ubmFtZSA9ICJ1bWFwLmhhcm1vbnkiKQoKIyBDcmVhdGUgY29tYmluZWQgcGxvdApsaWJyYXJ5KHBhdGNod29yaykKCnAxIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAic2FtcGxlX2dyb3VwIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIlNhbXBsZSBHcm91cCIpCnAyIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lX2dyb3VwIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIkNlbGwgTGluZSBHcm91cCIpCnAzIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIkNlbGwgTGluZSIpCgojIFByaW50IHRoZSBwbG90cwpwcmludChwMSArIHAyICtwMykKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAic2FtcGxlX2dyb3VwIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIlNhbXBsZSBHcm91cCIpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lX2dyb3VwIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIkNlbGwgTGluZSBHcm91cCIpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIkNlbGwgTGluZSIpCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5ib3ggPSBUUlVFKSArIAogIGdndGl0bGUoIkFubm90YXRpb25zIikKCmBgYAoKCgojIyAgTWFya2VyIEdlbmUgVmlzdWFsaXphdGlvbgpgYGB7ciBmZWF0dXJlcGxvdC1oYXJtb255LCBmaWcuaGVpZ2h0PTE0LCBmaWcud2lkdGg9MTh9CgoKIyBTZXQgbWFya2VyIGdlbmVzIHNwZWNpZmljIHRvIHJlcXVlc3RlZCBpbW11bmUgY2VsbCB0eXBlcwpteWZlYXR1cmVzIDwtIGMoIkNEMTkiLCAiQ0Q3OUEiLCAiTVM0QTEiLCAjIEIgY2VsbHMKICAgICAgICAgICAgICAgICJDRDE0IiwgIkxZWiIsICJGQ0dSM0EiLCAjIE1vbm9jeXRlcwogICAgICAgICAgICAgICAgIkNTRjFSIiwgIkNENjgiLCAjIE1hY3JvcGhhZ2VzCiAgICAgICAgICAgICAgICAiTktHNyIsICJHTkxZIiwgIktJUjNETDEiLCAjIE5LIGNlbGxzCiAgICAgICAgICAgICAgICAiTUtJNjciLCAjIFByb2xpZmVyYXRpbmcgTksgY2VsbHMKICAgICAgICAgICAgICAgICJDRDM0IiwgIktJVCIsICMgSFNQQ3MKICAgICAgICAgICAgICAgICJDRDNFIiwgIkNDUjciLCAjIFQgY2VsbHMKICAgICAgICAgICAgICAgICJTRUxMIiwgIkNENDVSTyIsICMgVG5haXZlLCBUY20KICAgICAgICAgICAgICAgICJDRDQ0IiwgIkNENDVSQSIpICMgVGVtLCBUZW1yYQojIFZpc3VhbGl6ZSBtYXJrZXIgZ2VuZXMgZm9yIEhhcm1vbnkKRmVhdHVyZVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmZWF0dXJlcyA9IG15ZmVhdHVyZXMsIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCBuY29sID0gNCkgKyAKICBnZ3RpdGxlKCJNYXJrZXIgR2VuZSBFeHByZXNzaW9uIC0gSGFybW9ueSBJbnRlZ3JhdGlvbiIpICsKICBOb0xlZ2VuZCgpCmBgYAoKIyA0LiBTYXZlIHRoZSBTZXVyYXQgb2JqZWN0IGFzIGFuIFJvYmogZmlsZQpgYGB7ciBzYXZlUk9CSn0KCnNhdmUoQWxsX3NhbXBsZXNfTWVyZ2VkLCBmaWxlID0gIi4uLy4uLy4uLzAtSU1QLU9CSkVDVFMvSGFybW9ueV9pbnRlZ3JhdGVkX0FsbF9zYW1wbGVzX01lcmdlZF93aXRoX1BCTUMxMHhfdXNpbmdfc2FtcGxlR3JvdXBfY2VsbF9saW5lX2NlbGxfbGluZUdyb3VwLlJvYmoiKQoKYGBgCgoKCgo=