3. UMAP visualization and Harmony Integration-1 Visualization
DimPlot(All_samples_Merged, reduction = "umap", group.by = "cell_line", label = T, label.box = T)

DimPlot(All_samples_Merged, reduction = "umap.harmony", group.by = "cell_line",label = T, label.box = T)

Harmony Visualization-2
library(harmony)
library(clustree)
Le chargement a nécessité le package : ggraph
Attachement du package : 'ggraph'
L'objet suivant est masqué depuis 'package:sp':
geometry
# Ensure the Harmony reduction is present
if (!"harmony" %in% Reductions(All_samples_Merged)) {
stop("Harmony reduction not found. Please run RunHarmony() first.")
}
# Run clustering using Harmony embeddings
All_samples_Merged <- FindNeighbors(All_samples_Merged, reduction = "harmony", dims = 1:22)
Computing nearest neighbor graph
Registered S3 method overwritten by 'rmarkdown':
method from
print.paged_df
Computing SNN
# Create a sequence of resolutions from 0.1 to 2 with 0.1 increments
resolutions <- seq(0.1, 2, by = 0.1)
# Loop through the resolutions
for (res in resolutions) {
# Find clusters for the current resolution using Harmony embeddings
All_samples_Merged <- FindClusters(All_samples_Merged, resolution = res)
# Create a new column for Harmony-based clustering
new_col_name <- paste0("Harmony_snn_res.", res)
All_samples_Merged[[new_col_name]] <- All_samples_Merged$seurat_clusters # Store cluster results here
# Create the plot for each resolution
plot <- DimPlot(All_samples_Merged,
group.by = new_col_name,
reduction = "umap.harmony",
label.size = 3,
repel = TRUE,
label = TRUE,
label.box = TRUE) +
ggtitle(paste("Harmony-based Clustering, Resolution:", res))
# Display the plot directly in the notebook
print(plot)
}
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9776
Number of communities: 10
Elapsed time: 21 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9606
Number of communities: 13
Elapsed time: 25 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9478
Number of communities: 15
Elapsed time: 24 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9354
Number of communities: 15
Elapsed time: 25 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9226
Number of communities: 18
Elapsed time: 26 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9143
Number of communities: 19
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.9055
Number of communities: 24
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8989
Number of communities: 24
Elapsed time: 21 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8922
Number of communities: 25
Elapsed time: 23 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8868
Number of communities: 28
Elapsed time: 26 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8809
Number of communities: 27
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8754
Number of communities: 30
Elapsed time: 24 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8709
Number of communities: 29
Elapsed time: 25 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8656
Number of communities: 29
Elapsed time: 23 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8608
Number of communities: 31
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8558
Number of communities: 33
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8515
Number of communities: 34
Elapsed time: 22 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8471
Number of communities: 35
Elapsed time: 23 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8437
Number of communities: 37
Elapsed time: 20 seconds
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
Number of nodes: 59355
Number of edges: 1882456
Running Louvain algorithm...
0% 10 20 30 40 50 60 70 80 90 100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8399
Number of communities: 37
Elapsed time: 24 seconds




















# Optionally, create a plot for a specific resolution (e.g., 0.5)
seurat_plot <- DimPlot(All_samples_Merged,
group.by = "Harmony_snn_res.0.9",
reduction = "umap.harmony",
label.size = 3,
repel = TRUE,
label = TRUE,
label.box = TRUE) +
ggtitle("Harmony-based Seurat Clusters (Resolution: 0.9)")
# Display the specific resolution plot
print(seurat_plot)

Harmony Visualization-3
# Combine clusters and cell lines for visualization
All_samples_Merged$Cluster_CellLine <- paste(All_samples_Merged$Harmony_snn_res.0.7, All_samples_Merged$cell_line, sep = "_")
# Plot with combined information
DimPlot(All_samples_Merged, group.by = "Cluster_CellLine", reduction = "umap.harmony", label = TRUE, label.size = 3) +
ggtitle("Clusters and Cell Lines on UMAP") + theme(legend.position = "none")

# Plot with combined information
DimPlot(All_samples_Merged, group.by = "Cluster_CellLine", reduction = "umap.harmony", label = TRUE, label.size = 3, label.box = T) +
ggtitle("Clusters and Cell Lines on UMAP") + theme(legend.position = "none")

p1 <- DimPlot(All_samples_Merged,
group.by = "Harmony_snn_res.0.7",
reduction = "umap.harmony",
label = TRUE,
repel = TRUE,
label.box = TRUE,
pt.size = 0.5) +
ggtitle("Clusters on UMAP") +
NoLegend()
p2 <- DimPlot(All_samples_Merged,
group.by = "cell_line",
reduction = "umap.harmony",
label = TRUE,
repel = TRUE,
label.box = TRUE,
pt.size = 0.5) +
ggtitle("Cell Lines on UMAP") +
NoLegend()
# Display plots side by side
p1 | p2

DimPlot(All_samples_Merged,
group.by = "predicted.celltype.l1",
reduction = "umap.harmony",
label.size = 3,
repel = T,
label = T, label.box = T)

DimPlot(All_samples_Merged,
group.by = "predicted.celltype.l2",
reduction = "umap.harmony",
label.size = 3,
repel = T,
label = T, label.box = T)

DimPlot(All_samples_Merged,
group.by = "predicted.celltype.l3",
reduction = "umap.harmony",
label.size = 3,
repel = T,
label = T, label.box = T)

NA
NA
NA
NA
NA
Harmony Visualization-4
# Set identity classes to an existing column in meta data
Idents(object = All_samples_Merged) <- "Harmony_snn_res.0.7"
cluster_table <- table(Idents(All_samples_Merged))
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$Harmony_snn_res.0.5)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
ASDC 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0
B intermediate 0 1 0 0 0 0 3 0 664 1 17 4 0 2 2 2 0 0
B memory 7 3 0 7 14 0 3 205 261 0 2 4 0 13 1 2 1 0
B naive 0 1 0 0 0 0 4 0 1170 1 2 13 0 0 1 0 0 0
CD14 Mono 3 1 8 0 0 20 2595 39 0 0 814 327 6 0 0 7 3 0
CD16 Mono 1 0 0 0 0 0 4 0 0 0 120 1 0 0 0 0 0 0
CD4 CTL 0 0 0 0 0 0 0 0 0 16 0 1 0 0 0 0 0 0
CD4 Naive 0 1989 0 0 0 0 0 0 7 0 0 6 0 0 40 0 0 1
CD4 Proliferating 10573 8 4839 6254 5489 412 1 738 2 1 0 23 48 490 132 1 0 0
CD4 TCM 909 5922 335 115 212 2649 18 1293 65 38 32 398 579 43 256 3 0 11
CD4 TEM 0 80 0 0 0 1 0 0 0 10 0 3 0 0 0 0 0 0
CD8 Naive 0 1330 0 0 0 0 0 0 2 1 1 20 1 0 17 0 1 0
CD8 Proliferating 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
CD8 TCM 1 370 9 0 0 0 0 0 2 80 0 6 7 0 1 0 0 1
CD8 TEM 0 64 6 0 1 0 1 6 1 305 0 0 0 0 7 0 0 0
cDC1 0 0 0 0 0 0 13 5 0 0 0 0 0 2 1 21 0 0
cDC2 0 0 1 1 2 0 123 45 0 0 1 0 0 3 0 53 0 0
dnT 0 31 0 0 0 1 0 7 2 0 3 17 0 0 20 0 0 1
gdT 0 15 0 0 0 0 0 0 0 78 0 0 0 0 0 0 0 0
HSPC 55 0 0 1429 258 3 6 11 1 1 0 3 6 38 7 4 7 5
ILC 0 0 0 0 0 0 0 0 1 4 0 1 0 0 1 0 0 0
MAIT 0 9 0 0 0 0 0 0 0 227 0 3 0 0 3 0 0 0
NK 0 0 0 0 0 0 0 0 1 523 1 7 0 0 2 0 0 0
NK Proliferating 24 0 2818 15 254 0 0 6 0 2 0 4 0 11 32 0 1 0
NK_CD56bright 0 0 0 0 0 0 0 0 0 14 0 0 0 0 2 0 0 0
pDC 0 0 0 0 0 0 56 0 0 0 0 0 0 0 0 0 0 0
Plasmablast 0 0 0 0 0 0 5 0 13 0 0 0 0 0 1 0 0 0
Platelet 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 30 0
Treg 0 258 1 0 0 0 0 9 5 0 0 40 0 0 39 1 0 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$Harmony_snn_res.0.6)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
ASDC 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0
B intermediate 0 0 0 0 0 0 1 0 3 664 1 17 4 0 2 2 2 0 0
B memory 7 1 0 1 219 6 2 0 3 261 0 2 4 0 13 1 2 1 0
B naive 0 0 0 0 0 0 1 0 4 1170 1 2 13 0 0 1 0 0 0
CD14 Mono 3 0 8 0 39 0 1 20 2521 0 0 818 397 6 0 0 7 3 0
CD16 Mono 1 0 0 0 0 0 0 0 4 0 0 120 1 0 0 0 0 0 0
CD4 CTL 0 0 0 0 0 0 0 0 0 0 16 0 1 0 0 0 0 0 0
CD4 Naive 0 0 0 1957 0 0 33 0 0 7 0 0 5 0 0 40 0 0 1
CD4 Proliferating 10573 6721 4472 1 2719 3039 8 775 1 2 1 0 26 48 492 132 1 0 0
CD4 TCM 913 91 305 2662 1469 55 3257 2674 18 65 47 32 394 583 44 256 2 0 11
CD4 TEM 0 0 0 6 0 0 68 1 0 0 16 0 3 0 0 0 0 0 0
CD8 Naive 0 0 0 1316 0 0 13 0 0 2 2 1 20 1 0 17 0 1 0
CD8 Proliferating 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TCM 1 0 9 128 0 0 221 0 0 2 101 0 6 7 0 1 0 0 1
CD8 TEM 0 0 6 5 7 0 44 0 1 1 321 0 0 0 0 6 0 0 0
cDC1 0 0 0 0 5 0 0 0 13 0 0 0 0 0 2 1 21 0 0
cDC2 0 1 1 0 47 0 0 0 121 0 0 1 2 0 3 0 53 0 0
dnT 0 0 0 7 7 0 24 1 0 2 0 3 17 0 0 20 0 0 1
gdT 0 0 0 9 0 0 6 0 0 0 78 0 0 0 0 0 0 0 0
HSPC 55 905 0 0 34 759 0 3 6 1 1 0 3 6 38 7 4 7 5
ILC 0 0 0 0 0 0 0 0 0 1 4 0 1 0 0 1 0 0 0
MAIT 0 0 0 0 0 0 8 0 0 0 228 0 3 0 0 3 0 0 0
NK 0 0 0 0 0 0 0 0 0 1 523 1 7 0 0 2 0 0 0
NK Proliferating 24 220 2813 0 49 6 0 4 0 0 2 0 5 0 11 32 0 1 0
NK_CD56bright 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 2 0 0 0
pDC 0 0 0 0 0 0 0 0 56 0 0 0 0 0 0 0 0 0 0
Plasmablast 0 0 0 0 0 0 0 0 5 13 0 0 0 0 0 1 0 0 0
Platelet 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 30 0
Treg 0 0 0 94 9 0 164 0 0 5 0 0 41 0 0 39 1 0 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$Harmony_snn_res.0.7)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
ASDC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0
B intermediate 0 0 0 5 0 0 0 0 0 0 3 664 0 1 17 0 2 2 0 0 0 2 0
B memory 6 1 0 6 0 219 0 6 1 0 1 261 1 0 2 0 13 1 0 2 0 2 1
B naive 0 0 0 7 0 0 0 0 0 0 4 1170 0 1 0 0 0 1 7 0 2 0 0
CD14 Mono 3 0 0 17 0 39 9 0 0 20 2593 0 0 0 809 6 0 0 310 2 5 7 3
CD16 Mono 1 0 0 0 0 0 0 0 0 0 4 0 0 0 18 0 0 0 1 0 102 0 0
CD4 CTL 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 1 0 0 0 0
CD4 Naive 0 1957 0 37 0 0 0 0 0 0 0 7 0 0 0 0 0 40 1 0 0 0 0
CD4 Proliferating 8798 1 4328 32 1810 2035 3106 2941 3172 331 1 2 1781 1 0 49 493 129 0 0 0 1 0
CD4 TCM 827 2658 89 3632 7 1474 339 51 1 2629 18 65 87 47 32 588 42 257 21 0 0 3 0
CD4 TEM 0 6 0 72 0 0 0 0 0 1 0 0 0 15 0 0 0 0 0 0 0 0 0
CD8 Naive 0 1316 0 32 0 0 0 0 0 0 0 2 0 1 1 1 0 17 2 0 0 0 1
CD8 Proliferating 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TCM 1 124 0 248 0 0 9 0 0 0 0 2 0 84 0 7 0 1 0 0 0 0 0
CD8 TEM 0 5 0 45 1 7 5 0 0 0 1 1 0 320 0 0 0 6 0 0 0 0 0
cDC1 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 2 1 0 13 0 21 0
cDC2 0 0 1 0 0 47 1 0 0 0 56 0 0 0 0 0 3 0 0 67 1 53 0
dnT 0 7 0 41 0 7 0 0 0 1 0 2 0 0 3 0 0 20 0 0 0 0 0
gdT 0 9 0 6 0 0 0 0 0 0 0 0 0 78 0 0 0 0 0 0 0 0 0
HSPC 55 0 808 3 0 40 0 752 97 3 4 1 0 1 0 6 39 7 0 2 0 4 7
ILC 0 0 0 1 0 0 0 0 0 0 0 1 0 4 0 0 0 1 0 0 0 0 0
MAIT 0 0 0 9 0 0 0 0 0 0 0 0 0 228 0 0 0 3 2 0 0 0 0
NK 0 0 0 0 0 0 0 0 0 0 0 1 0 523 1 0 0 2 7 0 0 0 0
NK Proliferating 9 0 13 5 2401 10 416 6 246 0 0 0 15 2 0 0 11 32 0 0 0 0 1
NK_CD56bright 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 2 0 0 0 0 0
pDC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0
Plasmablast 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 1 0 5 0 0 0
Platelet 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 30
Treg 0 94 0 203 0 9 1 0 0 0 0 5 0 0 0 0 0 39 1 0 0 1 0
23
ASDC 0
B intermediate 0
B memory 0
B naive 0
CD14 Mono 0
CD16 Mono 0
CD4 CTL 0
CD4 Naive 1
CD4 Proliferating 0
CD4 TCM 11
CD4 TEM 0
CD8 Naive 0
CD8 Proliferating 0
CD8 TCM 1
CD8 TEM 0
cDC1 0
cDC2 0
dnT 1
gdT 0
HSPC 5
ILC 0
MAIT 0
NK 0
NK Proliferating 0
NK_CD56bright 0
pDC 0
Plasmablast 0
Platelet 0
Treg 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$Harmony_snn_res.0.8)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
ASDC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0
B intermediate 0 0 0 0 0 0 1 0 0 3 0 664 0 1 4 17 0 2 2 0 0 2 0
B memory 6 1 0 1 7 218 2 0 0 1 0 261 1 0 4 2 0 13 1 2 0 2 1
B naive 0 0 0 0 0 0 1 0 0 4 0 1170 0 1 13 0 0 0 1 0 2 0 0
CD14 Mono 3 0 0 0 0 39 1 0 20 2590 9 0 0 0 326 812 6 0 0 2 5 7 3
CD16 Mono 1 0 0 0 0 0 0 0 0 4 0 0 0 0 1 18 0 0 0 0 102 0 0
CD4 CTL 0 0 0 0 0 0 0 0 0 0 0 0 0 16 1 0 0 0 0 0 0 0 0
CD4 Naive 0 1965 0 0 0 0 23 0 0 0 0 7 0 0 7 0 0 0 40 0 0 0 0
CD4 Proliferating 8955 1 2561 4213 3123 2096 4 3049 395 1 2290 2 1613 1 29 0 50 495 132 0 0 1 0
CD4 TCM 838 2727 37 74 59 1428 3159 53 2638 18 303 65 75 45 430 32 584 43 256 0 0 3 0
CD4 TEM 0 6 0 0 0 0 71 0 1 0 0 0 0 13 3 0 0 0 0 0 0 0 0
CD8 Naive 0 1315 0 0 0 0 13 0 0 0 0 2 0 1 22 1 1 0 17 0 0 0 1
CD8 Proliferating 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TCM 1 124 0 0 0 0 244 0 0 0 9 2 0 82 6 0 7 0 1 0 0 0 0
CD8 TEM 0 5 1 0 0 7 55 0 0 1 5 1 0 309 0 0 0 0 7 0 0 0 0
cDC1 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 2 1 13 0 21 0
cDC2 0 0 0 0 0 47 0 1 0 56 1 0 0 0 0 0 0 3 0 67 1 53 0
dnT 0 7 0 0 0 7 24 0 1 0 0 2 0 0 17 3 0 0 20 0 0 0 0
gdT 0 9 0 0 0 0 6 0 0 0 0 0 0 77 0 0 0 0 1 0 0 0 0
HSPC 55 0 0 256 782 21 0 639 3 4 0 1 0 1 3 0 6 38 7 2 0 4 7
ILC 0 0 0 0 0 0 0 0 0 0 0 1 0 4 1 0 0 0 1 0 0 0 0
MAIT 0 1 0 0 0 0 5 0 0 0 0 0 0 230 3 0 0 0 3 0 0 0 0
NK 0 0 0 0 0 0 0 0 0 0 0 1 0 518 7 1 0 0 7 0 0 0 0
NK Proliferating 11 0 2755 218 6 47 0 4 0 0 62 0 13 2 5 0 0 11 32 0 0 0 1
NK_CD56bright 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 2 0 0 0 0
pDC 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0
Plasmablast 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 0 0 1 5 0 0 0
Platelet 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 30
Treg 0 93 0 0 0 9 161 0 0 0 1 5 0 0 44 0 0 0 39 0 0 1 0
23
ASDC 0
B intermediate 0
B memory 0
B naive 0
CD14 Mono 0
CD16 Mono 0
CD4 CTL 0
CD4 Naive 1
CD4 Proliferating 0
CD4 TCM 11
CD4 TEM 0
CD8 Naive 0
CD8 Proliferating 0
CD8 TCM 1
CD8 TEM 0
cDC1 0
cDC2 0
dnT 1
gdT 0
HSPC 5
ILC 0
MAIT 0
NK 0
NK Proliferating 0
NK_CD56bright 0
pDC 0
Plasmablast 0
Platelet 0
Treg 0
table(All_samples_Merged$predicted.celltype.l2, All_samples_Merged$Harmony_snn_res.0.9)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
ASDC 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0
B intermediate 0 0 0 0 0 1 0 0 0 0 0 3 664 0 1 17 0 4 0 2 2 0 2
B memory 1 5 1 0 0 2 218 7 0 0 0 3 260 1 0 2 1 5 0 13 1 0 2
B naive 0 0 0 0 0 1 0 0 0 0 0 7 1170 0 1 0 0 6 0 0 1 6 0
CD14 Mono 0 1 2 0 0 1 38 0 9 0 20 2522 0 1 0 812 0 218 6 0 0 183 7
CD16 Mono 0 1 0 0 0 0 0 0 0 0 0 105 0 0 0 19 0 0 0 0 0 1 0
CD4 CTL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 1 0
CD4 Naive 1953 0 0 0 0 35 0 0 0 0 0 0 7 0 0 0 0 6 0 0 40 1 0
CD4 Proliferating 1 4409 4338 1901 3476 6 1977 2989 2946 3183 402 1 2 1846 1 0 825 28 48 498 133 0 1
CD4 TCM 2606 805 19 8 69 3290 1458 52 331 15 2643 18 65 107 53 32 1 392 580 44 256 20 3
CD4 TEM 6 0 0 0 0 69 0 0 0 0 1 0 0 0 15 0 0 3 0 0 0 0 0
CD8 Naive 1315 0 0 0 0 15 0 0 0 0 0 0 2 0 1 1 0 18 1 0 17 2 0
CD8 Proliferating 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CD8 TCM 121 1 0 0 0 237 0 0 9 0 0 0 2 0 92 0 0 6 7 0 1 0 0
CD8 TEM 5 0 0 1 0 40 7 0 5 0 0 1 1 0 324 0 0 0 0 0 7 0 0
cDC1 0 0 0 0 0 0 5 0 0 0 0 13 0 0 0 0 0 0 0 2 1 0 21
cDC2 0 0 0 0 1 0 47 0 1 0 0 122 0 0 0 0 0 0 0 3 0 2 53
dnT 7 0 0 0 0 24 7 0 0 0 1 0 2 0 0 3 0 17 0 0 20 0 0
gdT 9 0 0 0 0 6 0 0 0 0 0 0 0 0 77 0 0 0 0 0 1 0 0
HSPC 0 1 54 0 705 0 37 757 0 197 3 6 1 0 1 0 1 3 6 39 7 0 4
ILC 0 0 0 0 0 0 0 0 0 0 0 0 1 0 4 0 0 1 0 0 1 0 0
MAIT 0 0 0 0 0 8 0 0 0 0 0 0 0 0 228 0 0 1 0 0 3 2 0
NK 0 0 0 0 0 0 0 0 0 0 0 0 1 0 518 1 0 1 0 0 7 6 0
NK Proliferating 0 0 9 2374 5 0 8 6 443 218 0 0 0 15 2 0 38 5 0 11 32 0 0
NK_CD56bright 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 2 0 0
pDC 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0 0 0 0 0 0 0 0 0
Plasmablast 0 0 0 0 0 0 0 0 0 0 0 5 11 0 0 0 0 2 0 0 1 0 0
Platelet 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0
Treg 90 0 0 0 0 166 9 0 1 0 0 0 5 0 0 0 0 41 0 0 39 1 1
23 24
ASDC 0 0
B intermediate 0 0
B memory 1 0
B naive 0 0
CD14 Mono 3 0
CD16 Mono 0 0
CD4 CTL 0 0
CD4 Naive 0 1
CD4 Proliferating 0 0
CD4 TCM 0 11
CD4 TEM 0 0
CD8 Naive 1 0
CD8 Proliferating 0 0
CD8 TCM 0 1
CD8 TEM 0 0
cDC1 0 0
cDC2 0 0
dnT 0 1
gdT 0 0
HSPC 7 5
ILC 0 0
MAIT 0 0
NK 0 0
NK Proliferating 1 0
NK_CD56bright 0 0
pDC 0 0
Plasmablast 0 0
Platelet 30 0
Treg 0 0
table(All_samples_Merged$cell_line, All_samples_Merged$Harmony_snn_res.0.8)
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
L1 0 2 224 0 1 0 0 0 3026 16 1919 0 0 0 25 1 599 0 12 0 0 0 0 0
L2 2 0 5130 0 1 2 0 0 9 0 750 0 0 0 8 0 22 0 11 0 0 0 0 0
L3 6174 2 0 0 0 37 1 0 1 0 0 4 95 0 6 1 1 68 36 0 0 0 2 0
L4 3671 0 0 0 4 588 3 0 2 6 0 158 1607 1 18 12 2 57 18 1 0 2 0 0
L5 1 1 0 388 3049 448 4 1781 0 0 0 0 0 0 13 0 3 316 17 0 0 1 0 0
L6 14 1 0 3166 118 1225 2 326 0 0 0 0 0 1 23 0 8 106 158 0 0 0 0 0
L7 3 1 0 1208 804 1565 4 1639 0 0 0 0 0 0 19 0 2 57 29 0 0 0 0 0
PBMC 1 2796 0 0 0 24 2577 0 6 43 4 1097 0 401 449 743 2 3 81 8 3 91 6 19
PBMC_10x 4 3451 0 0 0 37 1179 0 14 2618 7 938 0 912 365 130 15 0 209 141 107 0 35 0
Harmony Visualization-5
clustree(All_samples_Merged, prefix = "Harmony_snn_res.")

Harmony Visualization-6
# Function to create and save tables for a given variable
create_and_save_tables <- function(variable_name) {
# Loop through resolutions from 0.5 to 1.2 with a step of 0.1
for (res in seq(0.5, 1.2, by = 0.1)) {
# Create the column name for the current resolution
col_name <- paste0("Harmony_snn_res.", res)
# Create the cross-tabulation
table_res <- table(All_samples_Merged[[variable_name]], All_samples_Merged[[col_name]])
# Create a filename for the current resolution
filename <- paste0(variable_name, "_vs_resolution_", res, ".csv")
# Save the table to CSV
write.csv(table_res, filename)
# Print a message to confirm the file was saved
print(paste("Saved:", filename))
}
}
# Create and save tables for predicted cell types
create_and_save_tables("predicted.celltype.l2")
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_0.5.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_0.6.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_0.7.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_0.8.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_0.9.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_1.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_1.1.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: predicted.celltype.l2_vs_resolution_1.2.csv"
# Create and save tables for cell lines
create_and_save_tables("cell_line")
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_0.5.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_0.6.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_0.7.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_0.8.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_0.9.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_1.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_1.1.csv"
Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)Avis : impossible d’utiliser xtfrm sur un tableau de données (data frame)
[1] "Saved: cell_line_vs_resolution_1.2.csv"
LS0tCnRpdGxlOiAiSGFybW9ueV9JbnRlcmdyYXRpb25zX2FuZF92aXN1YWxpemF0aW9uX29mX1BCTUMtMTB4LiIKYXV0aG9yOiBOYXNpciBNYWhtb29kIEFiYmFzaQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDoKICAjcm1kZm9ybWF0czo6cmVhZHRoZWRvd24KICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKLS0tCgoKIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2V1cmF0V3JhcHBlcnMpCmxpYnJhcnkoU2V1cmF0T2JqZWN0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShyZXRpY3VsYXRlKQpsaWJyYXJ5KEF6aW11dGgpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoUnRzbmUpCmxpYnJhcnkoaGFybW9ueSkKCm9wdGlvbnMoZnV0dXJlLmdsb2JhbHMubWF4U2l6ZSA9IDFlOSkKCmBgYAoKCgoKIyAyLiBMb2FkIFNldXJhdCBPYmplY3QgYW5kIHZpc3VhbGl6ZSBoYXJtb255aW50ZWdyYXRlZF9VTUFQCmBgYHtyIGxvYWRfc2V1cmF0fQoKI0xvYWQgU2V1cmF0IE9iamVjdCBtZXJnZWQgZnJvbSBjZWxsIGxpbmVzIGFuZCBhIGNvbnRyb2woUEJNQykgYWZ0ZXIgZmlsdHJhdGlvbgpsb2FkKCIuLi8uLi8uLi8wLUlNUC1PQkpFQ1RTL0hhcm1vbnlfaW50ZWdyYXRlZF9BbGxfc2FtcGxlc19NZXJnZWRfd2l0aF9QQk1DMTB4LlJvYmoiKQoKQWxsX3NhbXBsZXNfTWVyZ2VkCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKYGBgCgoKCiMgMy4gVU1BUCB2aXN1YWxpemF0aW9uIGFuZCBIYXJtb255IEludGVncmF0aW9uLTEgVmlzdWFsaXphdGlvbgpgYGB7ciBkYXRhMSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiY2VsbF9saW5lIiwgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCBncm91cC5ieSA9ICJjZWxsX2xpbmUiLGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCmBgYAoKIyMgIEhhcm1vbnkgVmlzdWFsaXphdGlvbi0yCmBgYHtyIGhhcm1vbnktdmlzdWFsaXphdGlvbjIsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQpsaWJyYXJ5KGhhcm1vbnkpCmxpYnJhcnkoY2x1c3RyZWUpCgojIEVuc3VyZSB0aGUgSGFybW9ueSByZWR1Y3Rpb24gaXMgcHJlc2VudAppZiAoISJoYXJtb255IiAlaW4lIFJlZHVjdGlvbnMoQWxsX3NhbXBsZXNfTWVyZ2VkKSkgewogIHN0b3AoIkhhcm1vbnkgcmVkdWN0aW9uIG5vdCBmb3VuZC4gUGxlYXNlIHJ1biBSdW5IYXJtb255KCkgZmlyc3QuIikKfQoKIyBSdW4gY2x1c3RlcmluZyB1c2luZyBIYXJtb255IGVtYmVkZGluZ3MKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEZpbmROZWlnaGJvcnMoQWxsX3NhbXBsZXNfTWVyZ2VkLCByZWR1Y3Rpb24gPSAiaGFybW9ueSIsIGRpbXMgPSAxOjIyKQoKIyBDcmVhdGUgYSBzZXF1ZW5jZSBvZiByZXNvbHV0aW9ucyBmcm9tIDAuMSB0byAyIHdpdGggMC4xIGluY3JlbWVudHMKcmVzb2x1dGlvbnMgPC0gc2VxKDAuMSwgMiwgYnkgPSAwLjEpCgojIExvb3AgdGhyb3VnaCB0aGUgcmVzb2x1dGlvbnMKZm9yIChyZXMgaW4gcmVzb2x1dGlvbnMpIHsKICAjIEZpbmQgY2x1c3RlcnMgZm9yIHRoZSBjdXJyZW50IHJlc29sdXRpb24gdXNpbmcgSGFybW9ueSBlbWJlZGRpbmdzCiAgQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEZpbmRDbHVzdGVycyhBbGxfc2FtcGxlc19NZXJnZWQsIHJlc29sdXRpb24gPSByZXMpCiAgCiAgIyBDcmVhdGUgYSBuZXcgY29sdW1uIGZvciBIYXJtb255LWJhc2VkIGNsdXN0ZXJpbmcKICBuZXdfY29sX25hbWUgPC0gcGFzdGUwKCJIYXJtb255X3Nubl9yZXMuIiwgcmVzKQogIEFsbF9zYW1wbGVzX01lcmdlZFtbbmV3X2NvbF9uYW1lXV0gPC0gQWxsX3NhbXBsZXNfTWVyZ2VkJHNldXJhdF9jbHVzdGVycyAgIyBTdG9yZSBjbHVzdGVyIHJlc3VsdHMgaGVyZQogIAogICMgQ3JlYXRlIHRoZSBwbG90IGZvciBlYWNoIHJlc29sdXRpb24KICBwbG90IDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgICAgICAgICAgICBncm91cC5ieSA9IG5ld19jb2xfbmFtZSwKICAgICAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsCiAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgICAgICAgICAgICByZXBlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKwogICAgICAgICAgZ2d0aXRsZShwYXN0ZSgiSGFybW9ueS1iYXNlZCBDbHVzdGVyaW5nLCBSZXNvbHV0aW9uOiIsIHJlcykpCiAgCiAgIyBEaXNwbGF5IHRoZSBwbG90IGRpcmVjdGx5IGluIHRoZSBub3RlYm9vawogIHByaW50KHBsb3QpCn0KCiMgT3B0aW9uYWxseSwgY3JlYXRlIGEgcGxvdCBmb3IgYSBzcGVjaWZpYyByZXNvbHV0aW9uIChlLmcuLCAwLjUpCnNldXJhdF9wbG90IDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmJ5ID0gIkhhcm1vbnlfc25uX3Jlcy4wLjkiLAogICAgICAgICAgICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgICAgICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYm94ID0gVFJVRSkgKwogICAgICAgICAgICAgICAgZ2d0aXRsZSgiSGFybW9ueS1iYXNlZCBTZXVyYXQgQ2x1c3RlcnMgKFJlc29sdXRpb246IDAuOSkiKQoKIyBEaXNwbGF5IHRoZSBzcGVjaWZpYyByZXNvbHV0aW9uIHBsb3QKcHJpbnQoc2V1cmF0X3Bsb3QpCmBgYAoKCiMjICBIYXJtb255IFZpc3VhbGl6YXRpb24tMwpgYGB7ciBoYXJtb255LXZpc3VhbGl6YXRpb24zLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgQ29tYmluZSBjbHVzdGVycyBhbmQgY2VsbCBsaW5lcyBmb3IgdmlzdWFsaXphdGlvbgpBbGxfc2FtcGxlc19NZXJnZWQkQ2x1c3Rlcl9DZWxsTGluZSA8LSBwYXN0ZShBbGxfc2FtcGxlc19NZXJnZWQkSGFybW9ueV9zbm5fcmVzLjAuNywgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSwgc2VwID0gIl8iKQoKIyBQbG90IHdpdGggY29tYmluZWQgaW5mb3JtYXRpb24KRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIGdyb3VwLmJ5ID0gIkNsdXN0ZXJfQ2VsbExpbmUiLCByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwgbGFiZWwgPSBUUlVFLCBsYWJlbC5zaXplID0gMykgKwogIGdndGl0bGUoIkNsdXN0ZXJzIGFuZCBDZWxsIExpbmVzIG9uIFVNQVAiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKCgojIFBsb3Qgd2l0aCBjb21iaW5lZCBpbmZvcm1hdGlvbgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwgZ3JvdXAuYnkgPSAiQ2x1c3Rlcl9DZWxsTGluZSIsIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCBsYWJlbCA9IFRSVUUsIGxhYmVsLnNpemUgPSAzLCBsYWJlbC5ib3ggPSBUKSArCiAgZ2d0aXRsZSgiQ2x1c3RlcnMgYW5kIENlbGwgTGluZXMgb24gVU1BUCIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKCnAxIDwtIERpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLCAKICAgICAgICAgICAgICBncm91cC5ieSA9ICJIYXJtb255X3Nubl9yZXMuMC43IiwgCiAgICAgICAgICAgICAgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsIAogICAgICAgICAgICAgIGxhYmVsID0gVFJVRSwgCiAgICAgICAgICAgICAgcmVwZWwgPSBUUlVFLAogICAgICAgICAgICAgIGxhYmVsLmJveCA9IFRSVUUsCiAgICAgICAgICAgICAgcHQuc2l6ZSA9IDAuNSkgKwogIGdndGl0bGUoIkNsdXN0ZXJzIG9uIFVNQVAiKSArCiAgTm9MZWdlbmQoKQoKcDIgPC0gRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsIAogICAgICAgICAgICAgIGdyb3VwLmJ5ID0gImNlbGxfbGluZSIsIAogICAgICAgICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLCAKICAgICAgICAgICAgICBsYWJlbCA9IFRSVUUsIAogICAgICAgICAgICAgIHJlcGVsID0gVFJVRSwKICAgICAgICAgICAgICBsYWJlbC5ib3ggPSBUUlVFLAogICAgICAgICAgICAgIHB0LnNpemUgPSAwLjUpICsKICBnZ3RpdGxlKCJDZWxsIExpbmVzIG9uIFVNQVAiKSArCiAgTm9MZWdlbmQoKQoKIyBEaXNwbGF5IHBsb3RzIHNpZGUgYnkgc2lkZQpwMSB8IHAyCgpEaW1QbG90KEFsbF9zYW1wbGVzX01lcmdlZCwKICAgICAgICBncm91cC5ieSA9ICJwcmVkaWN0ZWQuY2VsbHR5cGUubDEiLAogICAgICAgIHJlZHVjdGlvbiA9ICJ1bWFwLmhhcm1vbnkiLAogICAgICAgIGxhYmVsLnNpemUgPSAzLAogICAgICAgIHJlcGVsID0gVCwgCiAgICAgICAgbGFiZWwgPSBULCBsYWJlbC5ib3ggPSBUKQoKRGltUGxvdChBbGxfc2FtcGxlc19NZXJnZWQsCiAgICAgICAgZ3JvdXAuYnkgPSAicHJlZGljdGVkLmNlbGx0eXBlLmwyIiwKICAgICAgICByZWR1Y3Rpb24gPSAidW1hcC5oYXJtb255IiwKICAgICAgICBsYWJlbC5zaXplID0gMywKICAgICAgICByZXBlbCA9IFQsIAogICAgICAgIGxhYmVsID0gVCwgbGFiZWwuYm94ID0gVCkKCkRpbVBsb3QoQWxsX3NhbXBsZXNfTWVyZ2VkLAogICAgICAgIGdyb3VwLmJ5ID0gInByZWRpY3RlZC5jZWxsdHlwZS5sMyIsCiAgICAgICAgcmVkdWN0aW9uID0gInVtYXAuaGFybW9ueSIsCiAgICAgICAgbGFiZWwuc2l6ZSA9IDMsCiAgICAgICAgcmVwZWwgPSBULCAKICAgICAgICBsYWJlbCA9IFQsIGxhYmVsLmJveCA9IFQpCgoKCgoKYGBgCgojIyAgSGFybW9ueSBWaXN1YWxpemF0aW9uLTQKYGBge3IgaGFybW9ueS12aXN1YWxpemF0aW9uNCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTJ9CgojIFNldCBpZGVudGl0eSBjbGFzc2VzIHRvIGFuIGV4aXN0aW5nIGNvbHVtbiBpbiBtZXRhIGRhdGEKSWRlbnRzKG9iamVjdCA9IEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIkhhcm1vbnlfc25uX3Jlcy4wLjciCgpjbHVzdGVyX3RhYmxlIDwtIHRhYmxlKElkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpKQoKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIEFsbF9zYW1wbGVzX01lcmdlZCRIYXJtb255X3Nubl9yZXMuMC41KQp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkSGFybW9ueV9zbm5fcmVzLjAuNikKdGFibGUoQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgQWxsX3NhbXBsZXNfTWVyZ2VkJEhhcm1vbnlfc25uX3Jlcy4wLjcpCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIEFsbF9zYW1wbGVzX01lcmdlZCRIYXJtb255X3Nubl9yZXMuMC44KQp0YWJsZShBbGxfc2FtcGxlc19NZXJnZWQkcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBBbGxfc2FtcGxlc19NZXJnZWQkSGFybW9ueV9zbm5fcmVzLjAuOSkKCnRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUsIEFsbF9zYW1wbGVzX01lcmdlZCRIYXJtb255X3Nubl9yZXMuMC44KQoKYGBgCgoKIyMgIEhhcm1vbnkgVmlzdWFsaXphdGlvbi01CmBgYHtyIGhhcm1vbnktdmlzdWFsaXphdGlvbjUsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQoKCmNsdXN0cmVlKEFsbF9zYW1wbGVzX01lcmdlZCwgcHJlZml4ID0gIkhhcm1vbnlfc25uX3Jlcy4iKQoKYGBgCiMjICBIYXJtb255IFZpc3VhbGl6YXRpb24tNgpgYGB7ciBoYXJtb255LXZpc3VhbGl6YXRpb242LCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0KCiMgRnVuY3Rpb24gdG8gY3JlYXRlIGFuZCBzYXZlIHRhYmxlcyBmb3IgYSBnaXZlbiB2YXJpYWJsZQpjcmVhdGVfYW5kX3NhdmVfdGFibGVzIDwtIGZ1bmN0aW9uKHZhcmlhYmxlX25hbWUpIHsKICAjIExvb3AgdGhyb3VnaCByZXNvbHV0aW9ucyBmcm9tIDAuNSB0byAxLjIgd2l0aCBhIHN0ZXAgb2YgMC4xCiAgZm9yIChyZXMgaW4gc2VxKDAuNSwgMS4yLCBieSA9IDAuMSkpIHsKICAgICMgQ3JlYXRlIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGN1cnJlbnQgcmVzb2x1dGlvbgogICAgY29sX25hbWUgPC0gcGFzdGUwKCJIYXJtb255X3Nubl9yZXMuIiwgcmVzKQogICAgCiAgICAjIENyZWF0ZSB0aGUgY3Jvc3MtdGFidWxhdGlvbgogICAgdGFibGVfcmVzIDwtIHRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZFtbdmFyaWFibGVfbmFtZV1dLCBBbGxfc2FtcGxlc19NZXJnZWRbW2NvbF9uYW1lXV0pCiAgICAKICAgICMgQ3JlYXRlIGEgZmlsZW5hbWUgZm9yIHRoZSBjdXJyZW50IHJlc29sdXRpb24KICAgIGZpbGVuYW1lIDwtIHBhc3RlMCh2YXJpYWJsZV9uYW1lLCAiX3ZzX3Jlc29sdXRpb25fIiwgcmVzLCAiLmNzdiIpCiAgICAKICAgICMgU2F2ZSB0aGUgdGFibGUgdG8gQ1NWCiAgICB3cml0ZS5jc3YodGFibGVfcmVzLCBmaWxlbmFtZSkKICAgIAogICAgIyBQcmludCBhIG1lc3NhZ2UgdG8gY29uZmlybSB0aGUgZmlsZSB3YXMgc2F2ZWQKICAgIHByaW50KHBhc3RlKCJTYXZlZDoiLCBmaWxlbmFtZSkpCiAgfQp9CgojIENyZWF0ZSBhbmQgc2F2ZSB0YWJsZXMgZm9yIHByZWRpY3RlZCBjZWxsIHR5cGVzCmNyZWF0ZV9hbmRfc2F2ZV90YWJsZXMoInByZWRpY3RlZC5jZWxsdHlwZS5sMiIpCgojIENyZWF0ZSBhbmQgc2F2ZSB0YWJsZXMgZm9yIGNlbGwgbGluZXMKY3JlYXRlX2FuZF9zYXZlX3RhYmxlcygiY2VsbF9saW5lIikKCgoKCmBgYAoKCiMgNC4gU2F2ZSB0aGUgU2V1cmF0IG9iamVjdCBhcyBhbiBSb2JqIGZpbGUKYGBge3Igc2F2ZVJPQkp9Cgojc2F2ZShBbGxfc2FtcGxlc19NZXJnZWQsIGZpbGUgPSAiLi4vLi4vLi4vMC1JTVAtT0JKRUNUUy9IYXJtb255X2ludGVncmF0ZWRfQWxsX3NhbXBsZXNfTWVyZ2VkX3dpdGhfUEJNQzEweC5Sb2JqIikKCmBgYAoKCgoK