##. In this script I will remove Non T cells from PBMC

1. load libraries

2. Load Seurat Object


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


All_samples_Merged
An object of class Seurat 
36752 features across 59355 samples within 5 assays 
Active assay: RNA (36601 features, 0 variable features)
 2 layers present: data, counts
 4 other assays present: ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
 2 dimensional reductions calculated: integrated_dr, ref.umap

Cell type Distribution to check clusters

# We can apply it later on R obj to get these tables to compare it to decide about resolution.

# Azimuth l1
janitor::tabyl(All_samples_Merged@meta.data, predicted.celltype.l1, cell_line)
 predicted.celltype.l1   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                     B    0    0   12  131   35   85  121 1093      957
                 CD4 T 5771 3124 6351 5967 4914 4575 4634 5448     3639
                 CD8 T   13   25    0    1    4    5    3  814     1379
                    DC    0    0    1    4   29   12   41   71      196
                  Mono    0    0    1   13    3    0    5  754     3165
                    NK   38 2784    6   25   11  259   38   92      463
                 other    0    0   57    8 1025  208  487   19       46
               other T    3    2    0    1    1    4    2   63      317
# Azimuth l2
janitor::tabyl(All_samples_Merged@meta.data, predicted.celltype.l2, cell_line)
 predicted.celltype.l2   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                  ASDC    0    0    0    0    0    0    0    0        3
        B intermediate    0    0    2   54    2    2    0  457      179
              B memory    0    0   11   34   38   82  120  164       74
               B naive    0    0    0   41    0    0    0  459      692
             CD14 Mono    0    0    1   14    5    0    6  755     3042
             CD16 Mono    0    0    0    0    0    0    0    2      124
               CD4 CTL    0    0    0    0    0    0    0   16        1
             CD4 Naive    0    0    0    7    0    0    0  524     1512
     CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
               CD4 TCM 3320  270  887  562  178  557  517 4609     1978
               CD4 TEM    1    0    0    0    0    0    0   68       25
             CD8 Naive    0    0    0    0    0    0    0  361     1012
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
               CD8 TCM    1   16    0    0    0    0    0  286      174
               CD8 TEM    1    8    0    0    2    3    1  181      195
                  cDC1    0    0    0    0    2    6    0   21       13
                  cDC2    0    0    0    4   11    3   35   52      124
                   dnT    2    3    0    1    2    5    2   38       29
                   gdT    0    0    0    0    0    0    0   26       67
                  HSPC    0    0   60    7 1035  213  490   17       12
                   ILC    0    0    0    1    0    0    0    3        3
                  MAIT    0    0    0    0    0    0    0   14      228
                    NK    0    0    0    1    0    0    0   89      444
      NK Proliferating   38 2785    6   24   11  259   38    1        5
         NK_CD56bright    0    0    0    0    0    0    0    1       15
                   pDC    0    0    0    0    0    0    0    0       56
           Plasmablast    0    0    0    0    0    0    0    9       10
              Platelet    0    0    0    0    0    0    0    1       31
                  Treg    1    1    9    9    4   15    6  200      108
# Azimuth l3
janitor::tabyl(All_samples_Merged@meta.data, predicted.celltype.l3, cell_line)
 predicted.celltype.l3   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
              ASDC_pDC    0    0    0    0    0    0    0    0        4
  B intermediate kappa    0    0    0    1    0    0    0   75       51
 B intermediate lambda    0    0    2   48    4    2    3  371      129
        B memory kappa    0    0    7    1    7   22   55   38       42
       B memory lambda    0    0    3   41    7   29   26  131       30
         B naive kappa    0    0    0    0    0    0    0  267      645
        B naive lambda    0    0    0   37    0    0    0  192       48
             CD14 Mono    0    0    1   15    9    0   22  755     3043
             CD16 Mono    0    0    0    0    0    0    0    2      124
               CD4 CTL    0    0    0    0    0    0    0   27        1
             CD4 Naive    0    0    0    9    0    0    0  528     1525
     CD4 Proliferating 2462 2852 5452 5391 4732 4003 4115    0        6
             CD4 TCM_1 1932    6    6   35    0    7    3 4057     1449
             CD4 TCM_2  652  250  870  516  165  536  482  265      144
             CD4 TCM_3  436   12    4    6   13    7   26  267      359
             CD4 TEM_1    1    0    0    0    0    0    0    4        8
             CD4 TEM_2    0    0    0    0    0    0    0   17       17
             CD4 TEM_3    0    0    0    0    0    0    0   50        1
             CD8 Naive    0    0    0    0    0    0    0  291      969
           CD8 Naive_2    0    0    0    0    1    1    0   63       47
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
             CD8 TCM_1    0    8    0    0    0    0    0  137      115
             CD8 TCM_2  298    6    0    0    0    0    0   80       43
             CD8 TCM_3    0    1    0    0    0    0    0   77       17
             CD8 TEM_1    0    0    0    0    0    0    0   91       67
             CD8 TEM_2    0    0    0    0    0    1    0   32       62
             CD8 TEM_3    0    0    0    0    0    0    0   17       15
             CD8 TEM_4    0    0    0    0    0    0    0    2       12
             CD8 TEM_5    0    0    0    0    0    0    0   27        1
             CD8 TEM_6    1   10    0    0    1    1    1    1       36
                  cDC1    0    0    0    1   17   36   16   28       13
                cDC2_1    0    0    0    1    1    0    4    2       40
                cDC2_2    0    0    1    3   12    4   33   46       83
                 dnT_2    2    3    0    2    2    6    2   42       31
                 gdT_1    0    0    0    0    0    0    0   33       52
                 gdT_3    0    0    0    0    0    0    0    1       15
                  HSPC    0    0   62    7 1036  214  493   17       12
                   ILC    0    0    1    3    0    0    0    4        3
                  MAIT    0    0    0    0    0    0    0   16      229
      NK Proliferating   38 2785    6   24   11  259   38    1        5
                  NK_1    0    0    0    0    0    0    0   42        7
                  NK_2    0    0    0    0    0    0    0   18      386
                  NK_3    0    0    0    0    0    0    0   22       20
                  NK_4    0    0    0    0    0    0    0    3       30
         NK_CD56bright    0    0    0    0    0    0    0    1       16
                   pDC    0    0    0    0    0    0    0    0       56
                Plasma    0    0    0    0    0    0    0    9       10
              Platelet    0    0    0    0    0    0    0    1       31
           Treg Memory    3    2   13    9    4   19   11  200       89
            Treg Naive    0    0    0    0    0    0    0    4       24

Cell type Distribution barplot


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(All_samples_Merged$cell_line))
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("Cell lines") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)

NA
NA

3. filter cells just keep CD4 T cells


# Set identity to cell_line 
Idents(All_samples_Merged) <- "cell_line"

# Identify CD4 T cells in PBMC and PBMC_10x
cd4_cells_pbmc <- WhichCells(All_samples_Merged, expression = 
  grepl("^CD4", All_samples_Merged$predicted.celltype.l1) &
  grepl("^CD4", All_samples_Merged$predicted.celltype.l2) &
  grepl("^CD4", All_samples_Merged$predicted.celltype.l3) &
  (cell_line %in% c("PBMC", "PBMC_10x"))
)

# Select all cells from other cell lines
other_cells_seurat <- subset(All_samples_Merged, subset = cell_line %in% c("L1", "L2", "L3", "L4", "L5", "L6", "L7"))

# Get the cell names from the subset
other_cells <- colnames(other_cells_seurat)

# Combine the cell lists
cells_to_keep <- c(cd4_cells_pbmc, other_cells)

# Create the final filtered Seurat object
filtered_seurat <- subset(All_samples_Merged, cells = cells_to_keep)



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(filtered_seurat$cell_line))
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("Cell lines") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)

NA
NA

Cell type Distribution to check clusters


# We can apply it later on R obj to get these tables to compare it to decide about resolution.


janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l1, cell_line)
 predicted.celltype.l1   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                     B    0    0   12  131   35   85  121    0        0
                 CD4 T 5771 3124 6351 5967 4914 4575 4634 5171     3505
                 CD8 T   13   25    0    1    4    5    3    0        0
                    DC    0    0    1    4   29   12   41    0        0
                  Mono    0    0    1   13    3    0    5    0        0
                    NK   38 2784    6   25   11  259   38    0        0
                 other    0    0   57    8 1025  208  487    0        0
               other T    3    2    0    1    1    4    2    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l2, cell_line)
 predicted.celltype.l2   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
        B intermediate    0    0    2   54    2    2    0    0        0
              B memory    0    0   11   34   38   82  120    0        0
               B naive    0    0    0   41    0    0    0    0        0
             CD14 Mono    0    0    1   14    5    0    6    0        0
               CD4 CTL    0    0    0    0    0    0    0   12        1
             CD4 Naive    0    0    0    7    0    0    0  523     1512
     CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
               CD4 TCM 3320  270  887  562  178  557  517 4576     1963
               CD4 TEM    1    0    0    0    0    0    0   60       23
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
               CD8 TCM    1   16    0    0    0    0    0    0        0
               CD8 TEM    1    8    0    0    2    3    1    0        0
                  cDC1    0    0    0    0    2    6    0    0        0
                  cDC2    0    0    0    4   11    3   35    0        0
                   dnT    2    3    0    1    2    5    2    0        0
                  HSPC    0    0   60    7 1035  213  490    0        0
                   ILC    0    0    0    1    0    0    0    0        0
                    NK    0    0    0    1    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
                  Treg    1    1    9    9    4   15    6    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l3, cell_line)
 predicted.celltype.l3   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
  B intermediate kappa    0    0    0    1    0    0    0    0        0
 B intermediate lambda    0    0    2   48    4    2    3    0        0
        B memory kappa    0    0    7    1    7   22   55    0        0
       B memory lambda    0    0    3   41    7   29   26    0        0
        B naive lambda    0    0    0   37    0    0    0    0        0
             CD14 Mono    0    0    1   15    9    0   22    0        0
               CD4 CTL    0    0    0    0    0    0    0   14        1
             CD4 Naive    0    0    0    9    0    0    0  526     1524
     CD4 Proliferating 2462 2852 5452 5391 4732 4003 4115    0        6
             CD4 TCM_1 1932    6    6   35    0    7    3 4038     1447
             CD4 TCM_2  652  250  870  516  165  536  482  265      144
             CD4 TCM_3  436   12    4    6   13    7   26  265      359
             CD4 TEM_1    1    0    0    0    0    0    0    4        7
             CD4 TEM_2    0    0    0    0    0    0    0   15       16
             CD4 TEM_3    0    0    0    0    0    0    0   44        1
           CD8 Naive_2    0    0    0    0    1    1    0    0        0
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
             CD8 TCM_1    0    8    0    0    0    0    0    0        0
             CD8 TCM_2  298    6    0    0    0    0    0    0        0
             CD8 TCM_3    0    1    0    0    0    0    0    0        0
             CD8 TEM_2    0    0    0    0    0    1    0    0        0
             CD8 TEM_6    1   10    0    0    1    1    1    0        0
                  cDC1    0    0    0    1   17   36   16    0        0
                cDC2_1    0    0    0    1    1    0    4    0        0
                cDC2_2    0    0    1    3   12    4   33    0        0
                 dnT_2    2    3    0    2    2    6    2    0        0
                  HSPC    0    0   62    7 1036  214  493    0        0
                   ILC    0    0    1    3    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
           Treg Memory    3    2   13    9    4   19   11    0        0

4. filter B cells from L4


# Set identity to cell_line
Idents(filtered_seurat) <- "cell_line"


# Load necessary libraries
library(Seurat)
library(ggplot2)
library(RColorBrewer)

# Identify B cells in L4 to exclude
b_cells_l4 <- WhichCells(filtered_seurat, expression = 
  grepl("^B", filtered_seurat$predicted.celltype.l1) &
  grepl("^B", filtered_seurat$predicted.celltype.l2) &
  grepl("^B", filtered_seurat$predicted.celltype.l3) &
  cell_line == "L4"
)

# Identify cells to keep (excluding B cells in L4)
cells_to_keep <- setdiff(Cells(filtered_seurat), b_cells_l4)

# Subset the Seurat object with selected cells
filtered_seurat <- subset(filtered_seurat, cells = cells_to_keep)

# Plot the filtered data

# Define cell line colors
cell_line_colors <- brewer.pal(length(unique(filtered_seurat$cell_line)), "Set3")

# Generate data frame for plotting
data <- as.data.frame(table(filtered_seurat$cell_line))
colnames(data) <- c("cell_line", "nUMI")

# Create the bar plot
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)) +
  ggtitle("Filtered Cells per Sample") +
  xlab("Cell Lines") +
  ylab("Frequency")

print(ncells)

Cell type Distribution to check clusters

# We can apply it later on R obj to get these tables to compare it to decide about resolution.

# Azimuth l1
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l1, cell_line)
 predicted.celltype.l1   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                     B    0    0   12    4   35   85  121    0        0
                 CD4 T 5771 3124 6351 5967 4914 4575 4634 5171     3505
                 CD8 T   13   25    0    1    4    5    3    0        0
                    DC    0    0    1    4   29   12   41    0        0
                  Mono    0    0    1   13    3    0    5    0        0
                    NK   38 2784    6   25   11  259   38    0        0
                 other    0    0   57    8 1025  208  487    0        0
               other T    3    2    0    1    1    4    2    0        0
# Azimuth l2
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l2, cell_line)
 predicted.celltype.l2   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
        B intermediate    0    0    2    1    2    2    0    0        0
              B memory    0    0   11    1   38   82  120    0        0
             CD14 Mono    0    0    1   14    5    0    6    0        0
               CD4 CTL    0    0    0    0    0    0    0   12        1
             CD4 Naive    0    0    0    7    0    0    0  523     1512
     CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
               CD4 TCM 3320  270  887  562  178  557  517 4576     1963
               CD4 TEM    1    0    0    0    0    0    0   60       23
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
               CD8 TCM    1   16    0    0    0    0    0    0        0
               CD8 TEM    1    8    0    0    2    3    1    0        0
                  cDC1    0    0    0    0    2    6    0    0        0
                  cDC2    0    0    0    4   11    3   35    0        0
                   dnT    2    3    0    1    2    5    2    0        0
                  HSPC    0    0   60    7 1035  213  490    0        0
                   ILC    0    0    0    1    0    0    0    0        0
                    NK    0    0    0    1    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
                  Treg    1    1    9    9    4   15    6    0        0
# Azimuth l3
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l3, cell_line)
 predicted.celltype.l3   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
 B intermediate lambda    0    0    2    0    4    2    3    0        0
        B memory kappa    0    0    7    0    7   22   55    0        0
       B memory lambda    0    0    3    1    7   29   26    0        0
             CD14 Mono    0    0    1   15    9    0   22    0        0
               CD4 CTL    0    0    0    0    0    0    0   14        1
             CD4 Naive    0    0    0    9    0    0    0  526     1524
     CD4 Proliferating 2462 2852 5452 5391 4732 4003 4115    0        6
             CD4 TCM_1 1932    6    6   35    0    7    3 4038     1447
             CD4 TCM_2  652  250  870  516  165  536  482  265      144
             CD4 TCM_3  436   12    4    6   13    7   26  265      359
             CD4 TEM_1    1    0    0    0    0    0    0    4        7
             CD4 TEM_2    0    0    0    0    0    0    0   15       16
             CD4 TEM_3    0    0    0    0    0    0    0   44        1
           CD8 Naive_2    0    0    0    0    1    1    0    0        0
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
             CD8 TCM_1    0    8    0    0    0    0    0    0        0
             CD8 TCM_2  298    6    0    0    0    0    0    0        0
             CD8 TCM_3    0    1    0    0    0    0    0    0        0
             CD8 TEM_2    0    0    0    0    0    1    0    0        0
             CD8 TEM_6    1   10    0    0    1    1    1    0        0
                  cDC1    0    0    0    1   17   36   16    0        0
                cDC2_1    0    0    0    1    1    0    4    0        0
                cDC2_2    0    0    1    3   12    4   33    0        0
                 dnT_2    2    3    0    2    2    6    2    0        0
                  HSPC    0    0   62    7 1036  214  493    0        0
                   ILC    0    0    1    3    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
           Treg Memory    3    2   13    9    4   19   11    0        0

5. filter ILC and NK just one cells just keep CD4 T cells



# Set identity to cell_line 
Idents(filtered_seurat) <- "cell_line"



# Remove ILC and NK cells based on predicted.celltype.l2
filtered_seurat <- subset(filtered_seurat, subset = predicted.celltype.l2 != "ILC" & predicted.celltype.l2 != "NK")




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 filtered_seurat$cell_line is a factor or character vector containing cell line names
data <- as.data.frame(table(filtered_seurat$cell_line))
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("Cell lines") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)

NA
NA
NA

Cell type Distribution to check clusters


# We can apply it later on R obj to get these tables to compare it to decide about resolution.

# Azimuth l1
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l1, cell_line)
 predicted.celltype.l1   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                     B    0    0   12    4   35   85  121    0        0
                 CD4 T 5771 3124 6351 5967 4914 4575 4634 5171     3505
                 CD8 T   13   25    0    1    4    5    3    0        0
                    DC    0    0    1    4   29   12   41    0        0
                  Mono    0    0    1   13    3    0    5    0        0
                    NK   38 2784    6   24   11  259   38    0        0
                 other    0    0   57    7 1025  208  487    0        0
               other T    3    2    0    1    1    4    2    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l2, cell_line)
 predicted.celltype.l2   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
        B intermediate    0    0    2    1    2    2    0    0        0
              B memory    0    0   11    1   38   82  120    0        0
             CD14 Mono    0    0    1   14    5    0    6    0        0
               CD4 CTL    0    0    0    0    0    0    0   12        1
             CD4 Naive    0    0    0    7    0    0    0  523     1512
     CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
               CD4 TCM 3320  270  887  562  178  557  517 4576     1963
               CD4 TEM    1    0    0    0    0    0    0   60       23
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
               CD8 TCM    1   16    0    0    0    0    0    0        0
               CD8 TEM    1    8    0    0    2    3    1    0        0
                  cDC1    0    0    0    0    2    6    0    0        0
                  cDC2    0    0    0    4   11    3   35    0        0
                   dnT    2    3    0    1    2    5    2    0        0
                  HSPC    0    0   60    7 1035  213  490    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
                  Treg    1    1    9    9    4   15    6    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l3, cell_line)
 predicted.celltype.l3   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
 B intermediate lambda    0    0    2    0    4    2    3    0        0
        B memory kappa    0    0    7    0    7   22   55    0        0
       B memory lambda    0    0    3    1    7   29   26    0        0
             CD14 Mono    0    0    1   14    9    0   22    0        0
               CD4 CTL    0    0    0    0    0    0    0   14        1
             CD4 Naive    0    0    0    9    0    0    0  526     1524
     CD4 Proliferating 2462 2852 5452 5391 4732 4003 4115    0        6
             CD4 TCM_1 1932    6    6   35    0    7    3 4038     1447
             CD4 TCM_2  652  250  870  516  165  536  482  265      144
             CD4 TCM_3  436   12    4    6   13    7   26  265      359
             CD4 TEM_1    1    0    0    0    0    0    0    4        7
             CD4 TEM_2    0    0    0    0    0    0    0   15       16
             CD4 TEM_3    0    0    0    0    0    0    0   44        1
           CD8 Naive_2    0    0    0    0    1    1    0    0        0
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
             CD8 TCM_1    0    8    0    0    0    0    0    0        0
             CD8 TCM_2  298    6    0    0    0    0    0    0        0
             CD8 TCM_3    0    1    0    0    0    0    0    0        0
             CD8 TEM_2    0    0    0    0    0    1    0    0        0
             CD8 TEM_6    1   10    0    0    1    1    1    0        0
                  cDC1    0    0    0    1   17   36   16    0        0
                cDC2_1    0    0    0    1    1    0    4    0        0
                cDC2_2    0    0    1    3   12    4   33    0        0
                 dnT_2    2    3    0    2    2    6    2    0        0
                  HSPC    0    0   62    7 1036  214  493    0        0
                   ILC    0    0    1    2    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
           Treg Memory    3    2   13    9    4   19   11    0        0

6. filter cells just keep CD4 T cells



# Load necessary libraries
library(Seurat)
library(ggplot2)
library(RColorBrewer)

# Set identity to cell_line
Idents(filtered_seurat) <- "cell_line"

# Identify CD14 Monocytes in L4 to exclude
cd14_mono_l4 <- WhichCells(filtered_seurat, expression = 
  grepl("CD14 Mono", filtered_seurat$predicted.celltype.l2) &
  grepl("CD14 Mono", filtered_seurat$predicted.celltype.l3) &
  cell_line == "L4"
)

# Identify cells to keep (excluding CD14 Monocytes in L4)
cells_to_keep <- setdiff(Cells(filtered_seurat), cd14_mono_l4)

# Subset the Seurat object with selected cells
filtered_seurat <- subset(filtered_seurat, cells = cells_to_keep)
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 filtered_seurat$cell_line is a factor or character vector containing cell line names
data <- as.data.frame(table(filtered_seurat$cell_line))
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("Cell lines") +  # Adjust x-axis label
  ylab("Frequency")    # Adjust y-axis label

print(ncells)

NA
NA
NA

Cell type Distribution to check clusters


# We can apply it later on R obj to get these tables to compare it to decide about resolution.

# Azimuth l1
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l1, cell_line)
 predicted.celltype.l1   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
                     B    0    0   12    3   35   85  121    0        0
                 CD4 T 5771 3124 6351 5967 4914 4575 4634 5171     3505
                 CD8 T   13   25    0    1    4    5    3    0        0
                    DC    0    0    1    4   29   12   41    0        0
                  Mono    0    0    1    0    3    0    5    0        0
                    NK   38 2784    6   24   11  259   38    0        0
                 other    0    0   57    7 1025  208  487    0        0
               other T    3    2    0    1    1    4    2    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l2, cell_line)
 predicted.celltype.l2   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
        B intermediate    0    0    2    1    2    2    0    0        0
              B memory    0    0   11    1   38   82  120    0        0
             CD14 Mono    0    0    1    0    5    0    6    0        0
               CD4 CTL    0    0    0    0    0    0    0   12        1
             CD4 Naive    0    0    0    7    0    0    0  523     1512
     CD4 Proliferating 2461 2852 5452 5391 4732 4002 4115    0        6
               CD4 TCM 3320  270  887  562  178  557  517 4576     1963
               CD4 TEM    1    0    0    0    0    0    0   60       23
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
               CD8 TCM    1   16    0    0    0    0    0    0        0
               CD8 TEM    1    8    0    0    2    3    1    0        0
                  cDC1    0    0    0    0    2    6    0    0        0
                  cDC2    0    0    0    4   11    3   35    0        0
                   dnT    2    3    0    1    2    5    2    0        0
                  HSPC    0    0   60    7 1035  213  490    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
                  Treg    1    1    9    9    4   15    6    0        0
janitor::tabyl(filtered_seurat@meta.data, predicted.celltype.l3, cell_line)
 predicted.celltype.l3   L1   L2   L3   L4   L5   L6   L7 PBMC PBMC_10x
 B intermediate lambda    0    0    2    0    4    2    3    0        0
        B memory kappa    0    0    7    0    7   22   55    0        0
       B memory lambda    0    0    3    1    7   29   26    0        0
             CD14 Mono    0    0    1    0    9    0   22    0        0
               CD4 CTL    0    0    0    0    0    0    0   14        1
             CD4 Naive    0    0    0    9    0    0    0  526     1524
     CD4 Proliferating 2462 2852 5452 5391 4732 4003 4115    0        6
             CD4 TCM_1 1932    6    6   35    0    7    3 4038     1447
             CD4 TCM_2  652  250  870  516  165  536  482  265      144
             CD4 TCM_3  436   12    4    6   13    7   26  265      359
             CD4 TEM_1    1    0    0    0    0    0    0    4        7
             CD4 TEM_2    0    0    0    0    0    0    0   15       16
             CD4 TEM_3    0    0    0    0    0    0    0   44        1
           CD8 Naive_2    0    0    0    0    1    1    0    0        0
     CD8 Proliferating    0    0    0    0    0    1    1    0        0
             CD8 TCM_1    0    8    0    0    0    0    0    0        0
             CD8 TCM_2  298    6    0    0    0    0    0    0        0
             CD8 TCM_3    0    1    0    0    0    0    0    0        0
             CD8 TEM_2    0    0    0    0    0    1    0    0        0
             CD8 TEM_6    1   10    0    0    1    1    1    0        0
                  cDC1    0    0    0    1   17   36   16    0        0
                cDC2_1    0    0    0    1    1    0    4    0        0
                cDC2_2    0    0    1    3   12    4   33    0        0
                 dnT_2    2    3    0    2    2    6    2    0        0
                  HSPC    0    0   62    7 1036  214  493    0        0
                   ILC    0    0    1    2    0    0    0    0        0
      NK Proliferating   38 2785    6   24   11  259   38    0        0
           Treg Memory    3    2   13    9    4   19   11    0        0

7. Save the Seurat object as an Robj file

LS0tCnRpdGxlOiAidXNlIEFubm90YXRlZCBSb2JqIGluY2x1ZGluZyBQQk1DMTB4IHRvIHJlbW92ZSBOb25DRDRUY2VsbHMgZnJvbSBDb250cm9sIGFuZCBrZWVwIGp1c3QgQ0Q0VGNlbGxzIgphdXRob3I6IE5hc2lyIE1haG1vb2QgQWJiYXNpCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogICMgcGRmX2RvY3VtZW50OiBkZWZhdWx0CiAgIyB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgIyBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKCgojIy4gSW4gdGhpcyBzY3JpcHQgSSB3aWxsIHJlbW92ZSBOb24gVCBjZWxscyBmcm9tIFBCTUMgCgojIDEuIGxvYWQgbGlicmFyaWVzCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoU2V1cmF0T2JqZWN0KQpsaWJyYXJ5KFNldXJhdERhdGEpCmxpYnJhcnkocGF0Y2h3b3JrKQoKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkobWFncml0dHIpCmxpYnJhcnkoZGJwbHlyKQpsaWJyYXJ5KHJtYXJrZG93bikKbGlicmFyeShrbml0cikKbGlicmFyeSh0aW55dGV4KQojQXppbXV0aCBBbm5vdGF0aW9uIGxpYnJhcmllcwpsaWJyYXJ5KEF6aW11dGgpCiNQcm9qZWNUaWxzIEFubm90YXRpb24gbGlicmFyaWVzCmxpYnJhcnkoU1RBQ0FTKQpsaWJyYXJ5KFByb2plY1RJTHMpCiNzaW5nbGVSIEFubm90YXRpb24gbGlicmFyaWVzCmxpYnJhcnkoU2luZ2xlUikKbGlicmFyeShjZWxsZGV4KQpsaWJyYXJ5KFNpbmdsZUNlbGxFeHBlcmltZW50KQoKbGlicmFyeShjbHVzdHJlZSkKCmBgYAoKCiMgMi4gTG9hZCBTZXVyYXQgT2JqZWN0IApgYGB7ciBsb2FkX3NldXJhdH0KCiNMb2FkIFNldXJhdCBPYmplY3QgbWVyZ2VkIGZyb20gY2VsbCBsaW5lcyBhbmQgYSBjb250cm9sKFBCTUMpIGFmdGVyIGZpbHRyYXRpb24KbG9hZCgiLi4vMC1SX09iamVjdHMvQWxsX1NhbXBsZXNfTWVyZ2VkX3dpdGhfMTB4X0F6aXRtdXRoX0Fubm90YXRlZC5yb2JqIikKCgpBbGxfc2FtcGxlc19NZXJnZWQKCgpgYGAKCiMjICBDZWxsIHR5cGUgRGlzdHJpYnV0aW9uIHRvIGNoZWNrIGNsdXN0ZXJzCmBgYHtyIERpc3RyaWJ1dGlvbjEsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KIyBXZSBjYW4gYXBwbHkgaXQgbGF0ZXIgb24gUiBvYmogdG8gZ2V0IHRoZXNlIHRhYmxlcyB0byBjb21wYXJlIGl0IHRvIGRlY2lkZSBhYm91dCByZXNvbHV0aW9uLgoKIyBBemltdXRoIGwxCmphbml0b3I6OnRhYnlsKEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEsIHByZWRpY3RlZC5jZWxsdHlwZS5sMSwgY2VsbF9saW5lKQoKCiMgQXppbXV0aCBsMgpqYW5pdG9yOjp0YWJ5bChBbGxfc2FtcGxlc19NZXJnZWRAbWV0YS5kYXRhLCBwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIGNlbGxfbGluZSkKCiMgQXppbXV0aCBsMwpqYW5pdG9yOjp0YWJ5bChBbGxfc2FtcGxlc19NZXJnZWRAbWV0YS5kYXRhLCBwcmVkaWN0ZWQuY2VsbHR5cGUubDMsIGNlbGxfbGluZSkKCmBgYAoKIyMgIENlbGwgdHlwZSBEaXN0cmlidXRpb24gYmFycGxvdApgYGB7ciBEaXN0cmlidXRpb24yLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpICAKCiMgQXNzdW1pbmcgeW91IGhhdmUgMTAgZGlmZmVyZW50IGNlbGwgbGluZXMsIGdlbmVyYXRpbmcgYSBjb2xvciBwYWxldHRlIHdpdGggMTAgY29sb3JzCmNlbGxfbGluZV9jb2xvcnMgPC0gYnJld2VyLnBhbCgxMCwgIlNldDMiKQoKIyBBc3N1bWluZyBBbGxfc2FtcGxlc19NZXJnZWQkY2VsbF9saW5lIGlzIGEgZmFjdG9yIG9yIGNoYXJhY3RlciB2ZWN0b3IgY29udGFpbmluZyBjZWxsIGxpbmUgbmFtZXMKZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKEFsbF9zYW1wbGVzX01lcmdlZCRjZWxsX2xpbmUpKQpjb2xuYW1lcyhkYXRhKSA8LSBjKCJjZWxsX2xpbmUiLCAiblVNSSIpICAjIENoYW5nZSBjb2x1bW4gbmFtZSB0byBuVU1JCgpuY2VsbHMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gY2VsbF9saW5lLCB5ID0gblVNSSwgZmlsbCA9IGNlbGxfbGluZSkpICsgCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gblVNSSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjZWxsX2xpbmVfY29sb3JzKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgICMgQWRqdXN0IHRoZSB0aXRsZSBwb3NpdGlvbgogIGdndGl0bGUoIkZpbHRlcmVkIGNlbGxzIHBlciBzYW1wbGUiKSArCiAgeGxhYigiQ2VsbCBsaW5lcyIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbAogIHlsYWIoIkZyZXF1ZW5jeSIpICAgICMgQWRqdXN0IHktYXhpcyBsYWJlbAoKcHJpbnQobmNlbGxzKQoKCmBgYAoKIyAzLiBmaWx0ZXIgY2VsbHMganVzdCBrZWVwIENENCBUIGNlbGxzCmBgYHtyIERpc3RyaWJ1dGlvbjMsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKIyBTZXQgaWRlbnRpdHkgdG8gY2VsbF9saW5lIApJZGVudHMoQWxsX3NhbXBsZXNfTWVyZ2VkKSA8LSAiY2VsbF9saW5lIgoKIyBJZGVudGlmeSBDRDQgVCBjZWxscyBpbiBQQk1DIGFuZCBQQk1DXzEweApjZDRfY2VsbHNfcGJtYyA8LSBXaGljaENlbGxzKEFsbF9zYW1wbGVzX01lcmdlZCwgZXhwcmVzc2lvbiA9IAogIGdyZXBsKCJeQ0Q0IiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMSkgJgogIGdyZXBsKCJeQ0Q0IiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMikgJgogIGdyZXBsKCJeQ0Q0IiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHByZWRpY3RlZC5jZWxsdHlwZS5sMykgJgogIChjZWxsX2xpbmUgJWluJSBjKCJQQk1DIiwgIlBCTUNfMTB4IikpCikKCiMgU2VsZWN0IGFsbCBjZWxscyBmcm9tIG90aGVyIGNlbGwgbGluZXMKb3RoZXJfY2VsbHNfc2V1cmF0IDwtIHN1YnNldChBbGxfc2FtcGxlc19NZXJnZWQsIHN1YnNldCA9IGNlbGxfbGluZSAlaW4lIGMoIkwxIiwgIkwyIiwgIkwzIiwgIkw0IiwgIkw1IiwgIkw2IiwgIkw3IikpCgojIEdldCB0aGUgY2VsbCBuYW1lcyBmcm9tIHRoZSBzdWJzZXQKb3RoZXJfY2VsbHMgPC0gY29sbmFtZXMob3RoZXJfY2VsbHNfc2V1cmF0KQoKIyBDb21iaW5lIHRoZSBjZWxsIGxpc3RzCmNlbGxzX3RvX2tlZXAgPC0gYyhjZDRfY2VsbHNfcGJtYywgb3RoZXJfY2VsbHMpCgojIENyZWF0ZSB0aGUgZmluYWwgZmlsdGVyZWQgU2V1cmF0IG9iamVjdApmaWx0ZXJlZF9zZXVyYXQgPC0gc3Vic2V0KEFsbF9zYW1wbGVzX01lcmdlZCwgY2VsbHMgPSBjZWxsc190b19rZWVwKQoKCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoUkNvbG9yQnJld2VyKSAgCgojIEFzc3VtaW5nIHlvdSBoYXZlIDEwIGRpZmZlcmVudCBjZWxsIGxpbmVzLCBnZW5lcmF0aW5nIGEgY29sb3IgcGFsZXR0ZSB3aXRoIDEwIGNvbG9ycwpjZWxsX2xpbmVfY29sb3JzIDwtIGJyZXdlci5wYWwoMTAsICJTZXQzIikKCiMgQXNzdW1pbmcgQWxsX3NhbXBsZXNfTWVyZ2VkJGNlbGxfbGluZSBpcyBhIGZhY3RvciBvciBjaGFyYWN0ZXIgdmVjdG9yIGNvbnRhaW5pbmcgY2VsbCBsaW5lIG5hbWVzCmRhdGEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShmaWx0ZXJlZF9zZXVyYXQkY2VsbF9saW5lKSkKY29sbmFtZXMoZGF0YSkgPC0gYygiY2VsbF9saW5lIiwgIm5VTUkiKSAgIyBDaGFuZ2UgY29sdW1uIG5hbWUgdG8gblVNSQoKbmNlbGxzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGNlbGxfbGluZSwgeSA9IG5VTUksIGZpbGwgPSBjZWxsX2xpbmUpKSArIAogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5VTUkpLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIAogICAgICAgICAgICB2anVzdCA9IC0wLjI1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2VsbF9saW5lX2NvbG9ycykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICAjIEFkanVzdCB0aGUgdGl0bGUgcG9zaXRpb24KICBnZ3RpdGxlKCJGaWx0ZXJlZCBjZWxscyBwZXIgc2FtcGxlIikgKwogIHhsYWIoIkNlbGwgbGluZXMiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWwKICB5bGFiKCJGcmVxdWVuY3kiKSAgICAjIEFkanVzdCB5LWF4aXMgbGFiZWwKCnByaW50KG5jZWxscykKCgpgYGAKCgoKCiMjIENlbGwgdHlwZSBEaXN0cmlidXRpb24gdG8gY2hlY2sgY2x1c3RlcnMKYGBge3IgRGlzdHJpYnV0aW9uNCwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgojIFdlIGNhbiBhcHBseSBpdCBsYXRlciBvbiBSIG9iaiB0byBnZXQgdGhlc2UgdGFibGVzIHRvIGNvbXBhcmUgaXQgdG8gZGVjaWRlIGFib3V0IHJlc29sdXRpb24uCgoKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwxLCBjZWxsX2xpbmUpCgoKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBjZWxsX2xpbmUpCgoKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwzLCBjZWxsX2xpbmUpCgpgYGAKCgojIDQuIGZpbHRlciBCIGNlbGxzIGZyb20gTDQKYGBge3IgRGlzdHJpYnV0aW9uNSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgojIFNldCBpZGVudGl0eSB0byBjZWxsX2xpbmUKSWRlbnRzKGZpbHRlcmVkX3NldXJhdCkgPC0gImNlbGxfbGluZSIKCgojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKCiMgSWRlbnRpZnkgQiBjZWxscyBpbiBMNCB0byBleGNsdWRlCmJfY2VsbHNfbDQgPC0gV2hpY2hDZWxscyhmaWx0ZXJlZF9zZXVyYXQsIGV4cHJlc3Npb24gPSAKICBncmVwbCgiXkIiLCBmaWx0ZXJlZF9zZXVyYXQkcHJlZGljdGVkLmNlbGx0eXBlLmwxKSAmCiAgZ3JlcGwoIl5CIiwgZmlsdGVyZWRfc2V1cmF0JHByZWRpY3RlZC5jZWxsdHlwZS5sMikgJgogIGdyZXBsKCJeQiIsIGZpbHRlcmVkX3NldXJhdCRwcmVkaWN0ZWQuY2VsbHR5cGUubDMpICYKICBjZWxsX2xpbmUgPT0gIkw0IgopCgojIElkZW50aWZ5IGNlbGxzIHRvIGtlZXAgKGV4Y2x1ZGluZyBCIGNlbGxzIGluIEw0KQpjZWxsc190b19rZWVwIDwtIHNldGRpZmYoQ2VsbHMoZmlsdGVyZWRfc2V1cmF0KSwgYl9jZWxsc19sNCkKCiMgU3Vic2V0IHRoZSBTZXVyYXQgb2JqZWN0IHdpdGggc2VsZWN0ZWQgY2VsbHMKZmlsdGVyZWRfc2V1cmF0IDwtIHN1YnNldChmaWx0ZXJlZF9zZXVyYXQsIGNlbGxzID0gY2VsbHNfdG9fa2VlcCkKCiMgUGxvdCB0aGUgZmlsdGVyZWQgZGF0YQoKIyBEZWZpbmUgY2VsbCBsaW5lIGNvbG9ycwpjZWxsX2xpbmVfY29sb3JzIDwtIGJyZXdlci5wYWwobGVuZ3RoKHVuaXF1ZShmaWx0ZXJlZF9zZXVyYXQkY2VsbF9saW5lKSksICJTZXQzIikKCiMgR2VuZXJhdGUgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGZpbHRlcmVkX3NldXJhdCRjZWxsX2xpbmUpKQpjb2xuYW1lcyhkYXRhKSA8LSBjKCJjZWxsX2xpbmUiLCAiblVNSSIpCgojIENyZWF0ZSB0aGUgYmFyIHBsb3QKbmNlbGxzIDwtIGdncGxvdChkYXRhLCBhZXMoeCA9IGNlbGxfbGluZSwgeSA9IG5VTUksIGZpbGwgPSBjZWxsX2xpbmUpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gblVNSSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjI1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY2VsbF9saW5lX2NvbG9ycykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBnZ3RpdGxlKCJGaWx0ZXJlZCBDZWxscyBwZXIgU2FtcGxlIikgKwogIHhsYWIoIkNlbGwgTGluZXMiKSArCiAgeWxhYigiRnJlcXVlbmN5IikKCnByaW50KG5jZWxscykKCmBgYAoKIyMgQ2VsbCB0eXBlIERpc3RyaWJ1dGlvbiB0byBjaGVjayBjbHVzdGVycwpgYGB7ciBEaXN0cmlidXRpb242LCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9CiMgV2UgY2FuIGFwcGx5IGl0IGxhdGVyIG9uIFIgb2JqIHRvIGdldCB0aGVzZSB0YWJsZXMgdG8gY29tcGFyZSBpdCB0byBkZWNpZGUgYWJvdXQgcmVzb2x1dGlvbi4KCiMgQXppbXV0aCBsMQpqYW5pdG9yOjp0YWJ5bChmaWx0ZXJlZF9zZXVyYXRAbWV0YS5kYXRhLCBwcmVkaWN0ZWQuY2VsbHR5cGUubDEsIGNlbGxfbGluZSkKCiMgQXppbXV0aCBsMgpqYW5pdG9yOjp0YWJ5bChmaWx0ZXJlZF9zZXVyYXRAbWV0YS5kYXRhLCBwcmVkaWN0ZWQuY2VsbHR5cGUubDIsIGNlbGxfbGluZSkKCiMgQXppbXV0aCBsMwpqYW5pdG9yOjp0YWJ5bChmaWx0ZXJlZF9zZXVyYXRAbWV0YS5kYXRhLCBwcmVkaWN0ZWQuY2VsbHR5cGUubDMsIGNlbGxfbGluZSkKCgpgYGAKCgojIDUuIGZpbHRlciBJTEMgYW5kIE5LIGp1c3Qgb25lIGNlbGxzIGp1c3Qga2VlcCBDRDQgVCBjZWxscwpgYGB7ciBEaXN0cmlidXRpb243LCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCgojIFNldCBpZGVudGl0eSB0byBjZWxsX2xpbmUgCklkZW50cyhmaWx0ZXJlZF9zZXVyYXQpIDwtICJjZWxsX2xpbmUiCgoKCiMgUmVtb3ZlIElMQyBhbmQgTksgY2VsbHMgYmFzZWQgb24gcHJlZGljdGVkLmNlbGx0eXBlLmwyCmZpbHRlcmVkX3NldXJhdCA8LSBzdWJzZXQoZmlsdGVyZWRfc2V1cmF0LCBzdWJzZXQgPSBwcmVkaWN0ZWQuY2VsbHR5cGUubDIgIT0gIklMQyIgJiBwcmVkaWN0ZWQuY2VsbHR5cGUubDIgIT0gIk5LIikKCgoKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpICAKCiMgQXNzdW1pbmcgeW91IGhhdmUgMTAgZGlmZmVyZW50IGNlbGwgbGluZXMsIGdlbmVyYXRpbmcgYSBjb2xvciBwYWxldHRlIHdpdGggMTAgY29sb3JzCmNlbGxfbGluZV9jb2xvcnMgPC0gYnJld2VyLnBhbCgxMCwgIlNldDMiKQoKIyBBc3N1bWluZyBmaWx0ZXJlZF9zZXVyYXQkY2VsbF9saW5lIGlzIGEgZmFjdG9yIG9yIGNoYXJhY3RlciB2ZWN0b3IgY29udGFpbmluZyBjZWxsIGxpbmUgbmFtZXMKZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGZpbHRlcmVkX3NldXJhdCRjZWxsX2xpbmUpKQpjb2xuYW1lcyhkYXRhKSA8LSBjKCJjZWxsX2xpbmUiLCAiblVNSSIpICAjIENoYW5nZSBjb2x1bW4gbmFtZSB0byBuVU1JCgpuY2VsbHMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4ID0gY2VsbF9saW5lLCB5ID0gblVNSSwgZmlsbCA9IGNlbGxfbGluZSkpICsgCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gblVNSSksIAogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjZWxsX2xpbmVfY29sb3JzKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgICMgQWRqdXN0IHRoZSB0aXRsZSBwb3NpdGlvbgogIGdndGl0bGUoIkZpbHRlcmVkIGNlbGxzIHBlciBzYW1wbGUiKSArCiAgeGxhYigiQ2VsbCBsaW5lcyIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbAogIHlsYWIoIkZyZXF1ZW5jeSIpICAgICMgQWRqdXN0IHktYXhpcyBsYWJlbAoKcHJpbnQobmNlbGxzKQoKCgpgYGAKCgoKCiMjIENlbGwgdHlwZSBEaXN0cmlidXRpb24gdG8gY2hlY2sgY2x1c3RlcnMKYGBge3IgRGlzdHJpYnV0aW9uOCwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CgojIFdlIGNhbiBhcHBseSBpdCBsYXRlciBvbiBSIG9iaiB0byBnZXQgdGhlc2UgdGFibGVzIHRvIGNvbXBhcmUgaXQgdG8gZGVjaWRlIGFib3V0IHJlc29sdXRpb24uCgojIEF6aW11dGggbDEKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwxLCBjZWxsX2xpbmUpCgoKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwyLCBjZWxsX2xpbmUpCgoKamFuaXRvcjo6dGFieWwoZmlsdGVyZWRfc2V1cmF0QG1ldGEuZGF0YSwgcHJlZGljdGVkLmNlbGx0eXBlLmwzLCBjZWxsX2xpbmUpCgpgYGAKCiMgNi4gZmlsdGVyIGNlbGxzIGp1c3Qga2VlcCBDRDQgVCBjZWxscwpgYGB7ciBEaXN0cmlidXRpb245LCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCgojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKCiMgU2V0IGlkZW50aXR5IHRvIGNlbGxfbGluZQpJZGVudHMoZmlsdGVyZWRfc2V1cmF0KSA8LSAiY2VsbF9saW5lIgoKIyBJZGVudGlmeSBDRDE0IE1vbm9jeXRlcyBpbiBMNCB0byBleGNsdWRlCmNkMTRfbW9ub19sNCA8LSBXaGljaENlbGxzKGZpbHRlcmVkX3NldXJhdCwgZXhwcmVzc2lvbiA9IAogIGdyZXBsKCJDRDE0IE1vbm8iLCBmaWx0ZXJlZF9zZXVyYXQkcHJlZGljdGVkLmNlbGx0eXBlLmwyKSAmCiAgZ3JlcGwoIkNEMTQgTW9ubyIsIGZpbHRlcmVkX3NldXJhdCRwcmVkaWN0ZWQuY2VsbHR5cGUubDMpICYKICBjZWxsX2xpbmUgPT0gIkw0IgopCgojIElkZW50aWZ5IGNlbGxzIHRvIGtlZXAgKGV4Y2x1ZGluZyBDRDE0IE1vbm9jeXRlcyBpbiBMNCkKY2VsbHNfdG9fa2VlcCA8LSBzZXRkaWZmKENlbGxzKGZpbHRlcmVkX3NldXJhdCksIGNkMTRfbW9ub19sNCkKCiMgU3Vic2V0IHRoZSBTZXVyYXQgb2JqZWN0IHdpdGggc2VsZWN0ZWQgY2VsbHMKZmlsdGVyZWRfc2V1cmF0IDwtIHN1YnNldChmaWx0ZXJlZF9zZXVyYXQsIGNlbGxzID0gY2VsbHNfdG9fa2VlcCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikgIAoKIyBBc3N1bWluZyB5b3UgaGF2ZSAxMCBkaWZmZXJlbnQgY2VsbCBsaW5lcywgZ2VuZXJhdGluZyBhIGNvbG9yIHBhbGV0dGUgd2l0aCAxMCBjb2xvcnMKY2VsbF9saW5lX2NvbG9ycyA8LSBicmV3ZXIucGFsKDEwLCAiU2V0MyIpCgojIEFzc3VtaW5nIGZpbHRlcmVkX3NldXJhdCRjZWxsX2xpbmUgaXMgYSBmYWN0b3Igb3IgY2hhcmFjdGVyIHZlY3RvciBjb250YWluaW5nIGNlbGwgbGluZSBuYW1lcwpkYXRhIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZmlsdGVyZWRfc2V1cmF0JGNlbGxfbGluZSkpCmNvbG5hbWVzKGRhdGEpIDwtIGMoImNlbGxfbGluZSIsICJuVU1JIikgICMgQ2hhbmdlIGNvbHVtbiBuYW1lIHRvIG5VTUkKCm5jZWxscyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHggPSBjZWxsX2xpbmUsIHkgPSBuVU1JLCBmaWxsID0gY2VsbF9saW5lKSkgKyAKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuVU1JKSwgCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCAKICAgICAgICAgICAgdmp1c3QgPSAtMC4yNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNlbGxfbGluZV9jb2xvcnMpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAgIyBBZGp1c3QgdGhlIHRpdGxlIHBvc2l0aW9uCiAgZ2d0aXRsZSgiRmlsdGVyZWQgY2VsbHMgcGVyIHNhbXBsZSIpICsKICB4bGFiKCJDZWxsIGxpbmVzIikgKyAgIyBBZGp1c3QgeC1heGlzIGxhYmVsCiAgeWxhYigiRnJlcXVlbmN5IikgICAgIyBBZGp1c3QgeS1heGlzIGxhYmVsCgpwcmludChuY2VsbHMpCgoKCmBgYAoKCiMjIENlbGwgdHlwZSBEaXN0cmlidXRpb24gdG8gY2hlY2sgY2x1c3RlcnMKYGBge3IgRGlzdHJpYnV0aW9uMTAsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwfQoKIyBXZSBjYW4gYXBwbHkgaXQgbGF0ZXIgb24gUiBvYmogdG8gZ2V0IHRoZXNlIHRhYmxlcyB0byBjb21wYXJlIGl0IHRvIGRlY2lkZSBhYm91dCByZXNvbHV0aW9uLgoKIyBBemltdXRoIGwxCmphbml0b3I6OnRhYnlsKGZpbHRlcmVkX3NldXJhdEBtZXRhLmRhdGEsIHByZWRpY3RlZC5jZWxsdHlwZS5sMSwgY2VsbF9saW5lKQoKCmphbml0b3I6OnRhYnlsKGZpbHRlcmVkX3NldXJhdEBtZXRhLmRhdGEsIHByZWRpY3RlZC5jZWxsdHlwZS5sMiwgY2VsbF9saW5lKQoKCmphbml0b3I6OnRhYnlsKGZpbHRlcmVkX3NldXJhdEBtZXRhLmRhdGEsIHByZWRpY3RlZC5jZWxsdHlwZS5sMywgY2VsbF9saW5lKQoKYGBgCgoKCgojIDcuIFNhdmUgdGhlIFNldXJhdCBvYmplY3QgYXMgYW4gUm9iaiBmaWxlCmBgYHtyIHNhdmVST0JKLCBlY2hvPUZBTFNFfQoKc2F2ZShmaWx0ZXJlZF9zZXVyYXQsIGZpbGUgPSAiMC1pbXBfUm9iai9TU19DRDRfVGNlbGxzX0F6aW11dGhfQW5ub3RhdGVkX1BCTUMxMHhfZXhjbHVkaW5nX25vbkNENF9jZWxsc19mcm9tX0NvbnRyb2wucm9iaiIpCgoKYGBgCgoKCgoKCgo=