[33bf40]: / TcellAnalysis / notebooks / COVID_Tcell_annotations-Update.Rmd

Download this file

1145 lines (906 with data), 57.5 kB

---
title: "COVID19: T cell annotation - updated"
output: html_notebook
---

Annotating T cells subtypes.

```{r, warning=FALSE, message=FALSE}
library(ggplot2)
library(scran)
library(ggsci)
library(cowplot)
library(scattermore)
library(ComplexHeatmap)
library(RColorBrewer)
library(pheatmap)
library(scater)
library(reshape2)
library(colorspace)
library(dplyr)
library(ggthemes)
library(edgeR)
library(scales)
library(ggrepel)
library(viridis)
library(MASS)
```

I've taken all of the full clusters and selected the ones that I think contain T cells.

```{r, warning=FALSE, message=FALSE}
# tcell.umap <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle_Tcell_UMAPs.tsv",
#                          sep="\t", header=TRUE, stringsAsFactors=FALSE)
# fix the Sanger barcodes
# tcell.umap$CellID[tcell.umap$DataSet %in% c("Sanger")] <- gsub(tcell.umap$CellID[tcell.umap$DataSet %in% c("Sanger")],
#                                                                pattern="^(CV[0-9]+_[A-Z0-9]+-CV[0-9]+_[A-Z0-9]+)_", replacement="")

tcell.clusters <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle_Tcell_clusters.tsv",
                             sep="\t", header=TRUE, stringsAsFactors=FALSE)

# tcell.meta <- merge(tcell.umap, tcell.clusters, by='CellID')
```


```{r, warning=FALSE, message=FALSE}
all.meta <- read.table("~/Dropbox/COVID19/Data/Updated/COVID19_scMeta-data.tsv",
                       sep="\t", header=TRUE, stringsAsFactors=FALSE)
rownames(all.meta) <- all.meta$CellID

# remove BGCV01_CV0209 and CV0198
all.meta <- all.meta[!all.meta$sample_id %in% c("BGCV01_CV0902"), ]
all.meta <- all.meta[!all.meta$patient_id %in% c("CV0198"), ]
```

To normalise the cell type proportions, I need to know how many cells were captured for each patient-sample combo.

```{r, warning=FALSE, message=FALSE}
n.cell.vecc <- table(all.meta$sample_id)
```



```{r, warning=FALSE, message=FALSE}
# tcell.merge <- merge(tcell.clusters, tcell.umap, by='CellID')
tcell.merge <- tcell.clusters
# tcell.merge <- merge(tcell.clusters, all.meta, by='CellID')
# tcell.merge <- merge(tcell.merge, tcell.umap, by='CellID')
```


```{r}
gene.clust <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcells-cluster_gene-Ave.tsv",
                         sep="\t", header=TRUE, stringsAsFactors=FALSE)

protein.clust <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcells-cluster_protein-Ave.tsv",
                            sep="\t", header=TRUE, stringsAsFactors=FALSE)
```


```{r, warning=FALSE, message=FALSE}
plot.proteins <- unique(c("CD19", "CD86", "CD11b", "CD56", "CD8", "CD4", "CD3", "CD16", "CD14", "CD335", "CD158", "SIGLEC7",
                          "FCER2", "TCR", "CTLA4", "CXCR5", "ICOSL", "CD40LG",
                          "CX3CR1", "CD79b", "CD20", "CD1c", "CD25", "CD45RO", "HLA-DR", "CD21", "CD5", "CD64", "CD127",
                          "CD34", "CD40", "CD123", "CD27", "CD1c", "TCR_Va7.2", "TCR_Vg2", "CD235ab", "CD10", "CD2", "CD71",
                          "TCR_Vg9", "TCR_Va24-Ja18", "CCR7", "CD45RA", "CD62L", "CD138", "CD38", "CD274", "CD279", "TIGIT"))

plot.genes <- unique(c("CD3G", "CD3E", "FCGR3A", "CD8A", "CD8B", "CD4", "CD80", "CD86", "CXCL10", "HLA.DRA", "HLA.DRB1", "VEGFA",
                       "CCR7", "CCR2", "CCR5", "CXCR3", "CD36", "FOXP3", "MS4A1", "LYZ", "GZMB", "CD68", "GATA3", "PECAM1", "RORC", 
                       "FCGR2A", "FCGR2B", "FCGR3B", "TPO", "HBB", "NCR1", "NCR2", "F8", "HIF1A", "CTLA4", "CD28", "CXCR1",
                       "PDCD1", "TIM3", "LAG3", "TYMS", "PITX1", "TIGIT", "CXCL13", "BCL6", "TRAV1.2",
                       #"IGHD", "IGHM", "IGHA1", "IGHE", "IGHG1", "IGHG2", "IGHG3", "IGHG4",
                       "ITGA2B", "ITGAX", "TOX", "FYN", "NCAM1", "LRRC32", "SELL", "CXCR5", "CSF1", "IL7R", "CD40LG", "MYC", "MKI67",
                       "IFNG", "IL6", "THRB", "CD19", "CD38", "CD27", "F2", "F5", "THRB", "CD44", "IKZF2", "IKZF4"))
```


```{r, warning=FALSE, message=FALSE, fig.height=10.95, fig.width=9.95}
gene.plot.hm <- t(apply(t(gene.clust[, intersect(colnames(gene.clust), plot.genes)]), 1,
                        FUN=function(XP) XP/max(XP)))
gene.plot.hm[is.na(gene.plot.hm)] <- 0
colnames(gene.plot.hm) <- gene.clust$GeneID

pdf("~/Dropbox/COVID19/Updated_plots/Gene_heatmap-Tcells.pdf",
    height=10.95, width=9.95, useDingbats=FALSE)
Heatmap(gene.plot.hm, name="Z-score")
dev.off()

Heatmap(gene.plot.hm, name="Z-score")
```

I will take these clusters and compare them to the profiles of the original annotations.



```{r, warning=FALSE, message=FALSE}
table(tcell.merge$Centre, tcell.merge$Sub.Cluster)
```

```{r, warning=FALSE, message=FALSE}
table(tcell.merge$initial_clustering, tcell.merge$Sub.Cluster)
```



```{r, warning=FALSE, message=FALSE, fig.height=10.95, fig.width=9.95}
rownames(protein.clust) <- protein.clust$Protein
protein.plot.hm <- protein.clust[intersect(protein.clust$Protein, plot.proteins), 
                                 setdiff(colnames(protein.clust), "Protein")]
#protein.plot.hm[protein.plot.hm < 0] <- 0

# gene.plot.hm <- t(apply(t(gene.clust[, intersect(colnames(gene.clust), plot.genes)]), 1,
#                         FUN=function(XP) XP/max(XP)))

# protein.plot.hm <- t(apply(t(protein.plot.hm), 1, FUN=function(XP) (XP - mean(XP))/sd(XP)))

protein.plot.hm[protein.plot.hm <= 0] <- 0
protein.plot.hm <- t(apply(protein.plot.hm, 1, FUN=function(XP) (XP - mean(XP))/sd(XP)))
protein.plot.hm[is.na(protein.plot.hm)] <- 0

rownames(protein.plot.hm) <- intersect(protein.clust$Protein, plot.proteins)

# pdf("~/Dropbox/COVID19/Updated_plots/protein_heatmap-celltypes.pdf",
#     height=10.95, width=9.95, useDingbats=FALSE)
# Heatmap(protein.plot.hm, name="Z-score")
# dev.off()

Heatmap(protein.plot.hm, name="Z-score")
```

Compare the previous annotations.

```{r, warning=FALSE, message=FALSE}
old.annots <- read.csv("~/Dropbox/COVID19/Data/Annotations/annotation_200112.csv",
                       header=TRUE, stringsAsFactors=FALSE)

old.clusters <- read.table("~/Dropbox/COVID19/Data/Annotations/Cambridge_Sanger_Newcastle_Tcell_clusters.tsv",
                           sep="\t", header=TRUE, stringsAsFactors = TRUE)
colnames(old.clusters) <- c("CellID", "old.Sub.Cluster", "old.Louvain.Cluster")

tcell.annot.merge <- merge(tcell.merge, old.annots, by.x='CellID', by.y='X')
tcell.annot.merge <- merge(tcell.annot.merge, old.clusters, by='CellID')
```

```{r, warning=FALSE, message=FALSE}
table(tcell.annot.merge$full_clustering, tcell.annot.merge$Sub.Cluster)
```


```{r, warning=FALSE, message=FALSE}
table(tcell.annot.merge$old.Sub.Cluster, tcell.annot.merge$Sub.Cluster)
```

```{r, fig.height=4.95, fig.width=5.15}
tcell.clusts <- c("CD4.Prolif", "CD8.Prolif", "NK_prolif", "ILC1_3", "ILC2", "CD4.Naive", "CD8.Naive",
                  "CD4.Th17", "CD4.EM", "CD4.IL22", "CD4.Tfh", "CD4.CM", "CD4.Th1", "CD4.Th2", "Treg",
                  "gdT", "MAIT", "NKT", "CD8.EM", "CD8.TE", "NK_56hi", "NK_16hi")
comp.tab <- table(tcell.annot.merge$Sub.Cluster, tcell.annot.merge$full_clustering)
comp.tab <- apply(comp.tab[, tcell.clusts], 1, FUN=function(X) X/sum(X))

pheatmap(comp.tab, cluster_rows = FALSE)
```

This shows that the clustering only really identifies the major subsets.

```{r}
tcell.merge$Annotation <- "Unknown"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c()] <- "PoorQC"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(15)] <- "NK"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c()] <- "Doublets"

tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c()] <- "ILCs"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(9)] <- "gdT"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(8, 10, 19)] <- "CD8.TE"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(17)] <- "CD8.EM"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(1, 29)] <- "Tfh-like"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(2)] <- "Treg"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(21)] <- "MAIT"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(4, 5, 16, 18, 20, 22, 26)] <- "CD4.Naive"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(6, 24)] <- "CD8.Naive"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(3, 7, 12, 13, 14, 23, 27, 28)] <- "CD4.CM"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(11)] <- "CD4.IL22"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c()] <- "Exhausted"
tcell.merge$Annotation[tcell.merge$Sub.Cluster %in% c(25)] <- "Proliferating"

table(tcell.merge$Annotation, tcell.merge$Sub.Cluster)
```


```{r, warning=FALSE, message=FALSE}
table(tcell.merge$Annotation, tcell.merge$Site)
```

Plot the markers genes for these groups: CD4, CD8, TCR V$\alpha$7.2, TCR V$\gamma$9, TCR V$\gamma$2, CD45RA, CCR7, CD45RO, CD27, CD28,
CTLA4, HLA-DR, FOXP3, CXCR5, GZMB, IFNG, TOX, PDCD1.

I think these annotations look OK.

```{r, warning=FALSE, message=FALSE}
# read in the gene expression
goi.df <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcells_GeneGOI.tsv",
                     sep="\t", header=TRUE, stringsAsFactors=FALSE)

tcell.goi.merge <- merge(tcell.merge, goi.df, by='CellID')
```


```{r, warning=FALSE, message=FALSE}
# re-classify CD8.TE with high NCAM1 * FCGR3A expression
tcell.goi.merge$Annotation[tcell.goi.merge$NCAM1 > 0 & tcell.goi.merge$Annotation %in% c("CD8.TE", "NK") &
                               tcell.goi.merge$TRAV1.2 > 0] <- "NKT"
tcell.goi.merge$Annotation[tcell.goi.merge$FCGR3A > 0 & tcell.goi.merge$Annotation %in% c("CD8.TE", "NK") &
                               tcell.goi.merge$TRAV1.2 > 0] <- "NKT"
tcell.goi.merge$Annotation[tcell.goi.merge$FCGR3A > 0 & tcell.goi.merge$Annotation %in% c("CD8.TE") &
                               tcell.goi.merge$NCAM1 > 0] <- "NKT"
```

Remove doublets based on expression of markers for different cell lineages.

```{r}
# re-classify CD8.TE with high NCR1 * FCGR3A expression
bcell.markers <- tcell.goi.merge$IGHM > 0 | tcell.goi.merge$IGHG3 > 0 | tcell.goi.merge$IGHD > 0 | tcell.goi.merge$IGHG4 > 0 |
    tcell.goi.merge$IGHG2 > 0 | tcell.goi.merge$IGHG1 > 0 | tcell.goi.merge$IGHA1 > 0

tcell.goi.merge$Annotation[bcell.markers] <- "Doublets"

table(tcell.goi.merge$Annotation, tcell.goi.merge$Site)
```


```{r, fig.height=9.75, fig.width=10.95}
n.cells <- length(unique(tcell.goi.merge$Sub.Cluster))
cell.cols <- colorRampPalette(pal_futurama()(12))(n.cells)
names(cell.cols) <- unique(tcell.goi.merge$Sub.Cluster)

tcell.goi.merge$Sub.Cluster <- factor(tcell.goi.merge$Sub.Cluster,
                                      levels=c(1:29))

ggplot(tcell.goi.merge,
       aes(x=UMAP1, y=UMAP2)) +
    geom_scattermore(data=tcell.goi.merge[, c("UMAP1", "UMAP2")],
                    colour='grey80', alpha=0.5, size=0.1) +
    geom_scattermore(aes(colour=Sub.Cluster)) +
    theme_cowplot() +
    facet_wrap(~Annotation) +
    scale_colour_manual(values=cell.cols) +
    guides(colour=guide_legend(override.aes = list(size=3)))
```



```{r, warning=FALSE, message=FALSE}
clust.model.matrix <- model.matrix(~ 0 + Annotation, data=tcell.goi.merge)
rownames(clust.model.matrix) <- tcell.goi.merge$CellID

gene.goi.by.cluster <- t(clust.model.matrix) %*% as.matrix(tcell.goi.merge[, setdiff(colnames(goi.df), colnames(tcell.merge))])
gene.ave.by.label <- as.data.frame(apply(gene.goi.by.cluster, 2, function(X) X/colSums(clust.model.matrix)))
rownames(gene.ave.by.label) <- gsub(rownames(gene.ave.by.label), pattern="Annotation", replacement="")

gene.goi.by.cluster.bin <- t(clust.model.matrix) %*% as.matrix(tcell.goi.merge[, setdiff(colnames(goi.df), colnames(tcell.merge))] > 0)
gene.bin.by.label <- as.data.frame(apply(gene.goi.by.cluster.bin, 2, function(X) X/sum(X)))
gene.bin.by.label[is.na(gene.bin.by.label)] <- 0
rownames(gene.bin.by.label) <- gsub(rownames(gene.bin.by.label), pattern="Annotation", replacement="")
```


```{r, message=FALSE, warning=FALSE}
gene.ave.label.df <- as.data.frame(apply(gene.ave.by.label, 2, FUN=function(XP) XP/max(XP)))
gene.ave.label.df$Annotation <- rownames(gene.ave.label.df)
gene.ave.label.melt <- melt(gene.ave.label.df, id.vars='Annotation')
colnames(gene.ave.label.melt) <- c("Annotation", "Gene", "AveExprs")

gene.bin.label.df <- gene.bin.by.label
gene.bin.label.df$Annotation <- rownames(gene.bin.label.df)
gene.bin.label.melt <- melt(gene.bin.label.df, id.vars='Annotation')
colnames(gene.bin.label.melt) <- c("Annotation", "Gene", "PropExprs")

dot.plot.df <- merge(gene.ave.label.melt, gene.bin.label.melt, by=c('Annotation', 'Gene'))
dot.plot.df$Gene <- as.character(dot.plot.df$Gene)
```


```{r, message=FALSE, warning=FALSE, fig.height=5.15, fig.width=8.25}
dot.plot.genes <- c("CD3E", "CD8A", "CD8B", "CD4", "CCR7", "CD27", "CD28", "TOX", "CTLA4", "IFNG", "PDCD1", "GZMB", "IFNG",
                    "TRAV1.2", "TRDV2", "TRGV9", "CD40LG", "RORC", "CD38", "NCAM1",
                    "CXCR5", "HLA.DRB1", "LAG3", "CD44", "FOXP3", "MKI67", "NCR1", "GARP", "GZMH", "CXCR4", "FCGR3A", "TCF7")

ggplot(dot.plot.df[dot.plot.df$Gene %in% dot.plot.genes, ], 
       aes(x=Gene, y=Annotation, colour=AveExprs, size=PropExprs*100)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_gradient(low='grey70', high='blue') +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1, colour='black'),
          axis.text.y=element_text(colour='black'),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(colour=guide_colorbar(title='Mean Expression'),
           size=guide_legend(title='% Express')) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_dotplot-genes.pdf",
    #        height=5.15, width=8.25, useDingbats=FALSE) +
    NULL
```

Do the same for the proteins.

```{r, warning=FALSE, message=FALSE}
# read in the gene expression
prot.df <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcells_ProteinGOI.tsv",
                     sep="\t", header=TRUE, stringsAsFactors=FALSE)
colnames(prot.df) <- c(paste0("Prot.", colnames(prot.df)[!colnames(prot.df) %in% c("CellID")]), "CellID")

tcell.prot.merge <- merge(tcell.goi.merge, prot.df, by=c('CellID'))
```


```{r, warning=FALSE, message=FALSE}
clust.model.matrix <- model.matrix(~ 0 + Annotation, data=tcell.prot.merge)
rownames(clust.model.matrix) <- tcell.prot.merge$CellID

goi.by.cluster <- t(clust.model.matrix) %*% as.matrix(tcell.prot.merge[, gsub(setdiff(colnames(prot.df), colnames(tcell.merge)),
                                                                              pattern="\\.x", replacement="")])
ave.by.label <- as.data.frame(apply(goi.by.cluster, 2, function(X) X/colSums(clust.model.matrix)))
rownames(ave.by.label) <- gsub(rownames(ave.by.label), pattern="Annotation", replacement="")
colnames(ave.by.label) <- gsub(colnames(ave.by.label), pattern="Prot\\.", replacement="")

goi.by.cluster.bin <- t(clust.model.matrix) %*% as.matrix(tcell.prot.merge[, gsub(setdiff(colnames(prot.df), colnames(tcell.merge)),
                                                                              pattern="\\.x", replacement="")] > 0)
bin.by.label <- as.data.frame(apply(goi.by.cluster.bin, 2, function(X) X/sum(X)))
bin.by.label[is.na(bin.by.label)] <- 0
rownames(bin.by.label) <- gsub(rownames(bin.by.label), pattern="Annotation", replacement="")
colnames(bin.by.label) <- gsub(colnames(bin.by.label), pattern="Prot\\.", replacement="")
```


```{r, message=FALSE, warning=FALSE}
ave.label.df <- as.data.frame(apply(ave.by.label, 2, FUN=function(XP) (XP-min(XP))/max(XP-min(XP))))
ave.label.df$Annotation <- rownames(ave.label.df)
ave.label.melt <- melt(ave.label.df, id.vars='Annotation')
colnames(ave.label.melt) <- c("Annotation", "Protein", "AveExprs")

bin.label.df <- bin.by.label
bin.label.df$Annotation <- rownames(bin.label.df)
bin.label.melt <- melt(bin.label.df, id.vars='Annotation')
colnames(bin.label.melt) <- c("Annotation", "Protein", "PropExprs")

protein.dot.plot.df <- merge(ave.label.melt, bin.label.melt, by=c('Annotation', 'Protein'))
protein.dot.plot.df$Protein <- as.character(protein.dot.plot.df$Protein)
```


```{r, message=FALSE, warning=FALSE, fig.height=5.15, fig.width=8.25}
dot.plot.prots <- c("CD3", "CD8", "CD4", "CCR7", "CD45RA", "CD45RO", "CD28", "CD27", "CTLA4", "CD56", "CD16", "ICOSL",
                    "CD274", "CXCR3", "CD40LG", "CD38", "ICOS", "PD1", "HAVCR2",
                    "CXCR5", "TCR_Va7.2", "TCR_Vg2", "TCR_Vg9", "TCR_Va24-Ja18", "CD62L", "CD44", "TCR_Va24.Ja18")

ggplot(protein.dot.plot.df[protein.dot.plot.df$Protein %in% dot.plot.prots, ],
       aes(x=Protein, y=Annotation, colour=AveExprs, size=PropExprs*100)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_gradient(low='grey70', high=darken('red')) +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1, colour='black'),
          axis.text.y=element_text(colour='black'),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(colour=guide_colorbar(title='Mean Expression'),
           size=guide_legend(title='% Express')) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_dotplot-protein.pdf",
    #        height=5.15, width=8.25, useDingbats=FALSE) +
    NULL
```


Write out the exhausted, proliferating and Tfh-like clusters for sub-clustering.

```{r}
write.table(tcell.prot.merge$CellID[tcell.prot.merge$Annotation %in% c("Proliferating")],
            file="~/Dropbox/COVID19/Data/Updated/Proliferating_barcodes.tsv",
            quote=FALSE, col.names=FALSE, row.names=FALSE, sep="\t")

write.table(tcell.prot.merge$CellID[tcell.prot.merge$Annotation %in% c("Tfh-like")],
            file="~/Dropbox/COVID19/Data/Updated/Tfh_barcodes.tsv",
            quote=FALSE, col.names=FALSE, row.names=FALSE, sep="\t")

write.table(tcell.prot.merge$CellID[tcell.prot.merge$Annotation %in% c("Exhausted")],
            file="~/Dropbox/COVID19/Data/Updated/Exhausted_barcodes.tsv",
            quote=FALSE, col.names=FALSE, row.names=FALSE, sep="\t")

write.table(tcell.prot.merge$CellID[tcell.prot.merge$Annotation %in% c("Doublets")],
            file="~/Dropbox/COVID19/Data/Updated/Doublet_barcodes.tsv",
            quote=FALSE, col.names=FALSE, row.names=FALSE, sep="\t")
```

Fill in the sub-annotations.

```{r, warning=FALSE, message=FALSE}
rownames(tcell.prot.merge) <- tcell.prot.merge$CellID
tcell.prot.merge$Sub.Annotation <- tcell.prot.merge$Annotation

# first, enforce the original annotations on all previously annotated cells
old.annots <- read.csv("~/Dropbox/COVID19/Data/Annotations/annotation_200112.csv",
                       header=TRUE, stringsAsFactors=FALSE)
rownames(old.annots) <- old.annots$X
annot.merge <- merge(tcell.prot.merge, old.annots, by.x='CellID', by.y='X', all.x=TRUE)
annot.merge$Sub.Annotation[!is.na(annot.merge$full_clustering)] <- annot.merge$full_clustering[!is.na(annot.merge$full_clustering)]

annot.merge <- annot.merge[!annot.merge$full_clustering %in% c("CD14_mono", "B_naive", "DC_prolif", "DC3", "HSC", "Mono_prolif",
                                                               "NK_16hi", "NK_56hi", "NK_prolif", "pDC", "Plasmablast",
                                                               "Platelets", "RBC"), ]

# re-classify CD4s within CD8 clusters
annot.merge$Sub.Annotation[(annot.merge$CD8A > 0 | annot.merge$CD8B > 0) &
                                    annot.merge$CD4 <= 0 &
                                    annot.merge$CXCR5 <= 0 &
                                    annot.merge$Sub.Annotation %in% c("Tfh-like")] <- "CD8.TE"

# Tfh classification
annot.merge$Sub.Annotation[(annot.merge$CD8A <= 0 & annot.merge$CD8B <= 0) &
                                    annot.merge$CD4 > 0 &
                                    annot.merge$CXCR5 > 0 &
                                    annot.merge$Sub.Annotation %in% c("CD8.TE")] <- "CD4.Tfh"

# fix the Treg annotations
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("CD4.CM") &
                                    (annot.merge$CXCR5 > 0) & (annot.merge$CD40LG > 0)] <- "CD4.Tfh"

# final doublet classification
annot.merge$Sub.Annotation[annot.merge$IGHA1 > 0 | annot.merge$IGHD > 0 | annot.merge$IGHE > 0 | annot.merge$IGHG1 > 0 |
                                    annot.merge$IGHG2 > 0 | annot.merge$IGHG3 > 0 | annot.merge$IGHG4 > 0] <- "Doublets"

# final NKT classification
annot.merge$Sub.Annotation[annot.merge$FCGR3A > 0 & annot.merge$NCAM1 > 0 &  
                                    annot.merge$Sub.Annotation %in% c("CD8.EM", "CD8.TE", "CD8.Naive")] <- "NKT"
annot.merge$Sub.Annotation[annot.merge$FCGR3A > 0 & annot.merge$NCR1 > 0 & 
                                    annot.merge$Sub.Annotation %in% c("CD8.EM", "CD8.TE", "CD8.Naive")] <- "NKT"

# fix the Treg annotations
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("CD4.CM", "CD4.Naive", "CD4.Tfh", "Treg") &
                                    (annot.merge$IL22 > 0)] <- "CD4.IL22"

annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Treg") &
                                    !(annot.merge$FOXP3 > 0 & annot.merge$IKZF2 > 0)] <- "CD4.IL22"

# Add in a Th17 phenotype
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Treg", "CD4.CM", "CD4.Tfh", "CD4.EM", "CD4.Naive", "CD4.IL22") &
                                   (annot.merge$CD8A <= 0 & annot.merge$CD8B <= 0) &
                                    annot.merge$RORC > 0 &
                                    (annot.merge$IL17A > 0 | 
                                         annot.merge$IL17F > 0 | annot.merge$IL21 > 0)] <- "CD4.Th17"

# Add in a Th1 phenotype
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Treg", "CD4.CM", "CD4.EM", "CD4.Naive", "CD4.IL22") &
                                    (annot.merge$CD8A <= 0 & annot.merge$CD8B <= 0) &
                                    (annot.merge$IL2 > 0 | annot.merge$TNF > 0 | 
                                         annot.merge$LTA) &
                                    annot.merge$TBX21 > 0] <- "CD4.Th1"

# Add in a Th2 phenotype
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Treg", "CD4.CM", "CD4.EM", "CD4.Naive", "CD4.IL22") &
                                    (annot.merge$CD8A <= 0 & annot.merge$CD8B <= 0) &
                                    annot.merge$GATA3 > 0 &
                                    (annot.merge$IL4 > 0 | annot.merge$IL5 > 0)] <- "CD4.Th2"

# merge the Tfh annotation
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("PD1-.Tfh-like", "PD1+.Tfh-like", "Tfh-like")] <- "CD4.Tfh"

# Add in the proliferating/activated/exhausted annotation
active.tcells <- read.csv("~/Dropbox/COVID19/Data/prolif_CD4CD8.csv",
                          header=FALSE, stringsAsFactors=FALSE)
annot.merge$Sub.Annotation[annot.merge$CellID %in% active.tcells$V1[active.tcells$V2 %in% c("prolif_CD4")]] <- "CD4.Prolif"
annot.merge$Sub.Annotation[annot.merge$CellID %in% active.tcells$V1[active.tcells$V2 %in% c("prolif_CD8")]] <- "CD8.Prolif"

# CD4 prolif
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Proliferating") &
                                    (annot.merge$CD8A <= 0 & annot.merge$CD8B <= 0)] <- "CD4.Prolif"

annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("CD4.Prolif") &
                                    !(annot.merge$TYMS > 0 | annot.merge$MKI67 > 0)] <- "CD4.CM"


# CD8A
annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("Proliferating") &
                                    (annot.merge$CD8A > 0 | annot.merge$CD8B > 0)] <- "CD8.Prolif"

annot.merge$Sub.Annotation[annot.merge$Sub.Annotation %in% c("CD8.Prolif") &
                                    !(annot.merge$TYMS > 0 | annot.merge$MKI67 > 0)] <- "CD8.TE"

# table(annot.merge$Sub.Annotation, annot.merge$full_clustering)
table(annot.merge$Sub.Annotation, annot.merge$Site)
```

Compare to MNN-label transfers.

```{r, warning=FALSE, message=FALSE}
# only compare the MNN and new labels.
mnn.labels <- read.table("~/Dropbox/COVID19/Data/Updated/Tcell_MNN_labels.tsv",
                         sep="\t", header=TRUE, stringsAsFactors=FALSE)
mnn.compare <- merge(annot.merge, mnn.labels, by='CellID')

table(mnn.compare$Sub.Annotation.x, mnn.compare$Sub.Annotation.y)
```



```{r}
# write out the annotations, without the doublets, NK cells and ILCs
write.table(annot.merge[!annot.merge$Sub.Annotation %in% c("NK", "Prolif.NK", "ILCs", "B_naive", "CD14_mono",
                                                                   "DC_prolif", "DC3", "HSC", "ILC1_3", "ILC2", "Mono_prolif",
                                                                   "NK_16hi", "NK_56hi", "NK_prolif", "pDC", "Plasmablast",
                                                                   "Platelets", "RBC",
                                                                   "Doublets:Bcell", "Doublets:Platelet", "Doublets"),
                            c("CellID", "Sub.Annotation")],
            file="~/Dropbox/COVID19/Data/Updated/Tcell_annotations_ext.tsv",
            sep="\t", quote=FALSE, row.names=FALSE)

write.table(annot.merge[!annot.merge$Sub.Annotation %in% c("NK", "Prolif.NK", "ILCs", "B_naive", "CD14_mono",
                                                                   "DC_prolif", "DC3", "HSC", "ILC1_3", "ILC2", "Mono_prolif",
                                                                   "NK_16hi", "NK_56hi", "NK_prolif", "pDC", "Plasmablast",
                                                                   "Platelets", "RBC",
                                                                   "Doublets:Bcell", "Doublets:Platelet", "Doublets"),
                             c("CellID")],
            file="~/Dropbox/COVID19/Data/Updated/Tcell_barcodes.tsv",
            sep="\t", quote=FALSE, row.names=FALSE, col.names=FALSE)

```

Plot the proportions of T cells, normalised properly.

```{r}
cell.freq.tab <- table(annot.merge$sample_id,
                       annot.merge$Sub.Annotation)

cell.freq.df <- as.data.frame(sapply(rownames(cell.freq.tab), FUN=function(X) cell.freq.tab[X, ]/n.cell.vecc[X]))
cell.freq.df$CellType <- rownames(cell.freq.df)
cell.freq.df <- melt(cell.freq.df, id.vars=c("CellType"))
cell.freq.df$CellType <- as.character(cell.freq.df$CellType)
colnames(cell.freq.df) <- c("CellType", "sample_id", "Freq")
# cell.freq.df$Sex <- "Female"
# cell.freq.df$Sex[cell.freq.df$sample_id %in% unique(annot.merge$sample_id[annot.merge$Sex %in% c("M", "Male")])] <- "Male"
cell.freq.df$sample_id <- as.character(cell.freq.df$sample_id)

covid.meta <- read.csv("~/Dropbox/COVID19/Data/basic_COVID19_PBMC_metadata_160212.csv",
                        header=TRUE, stringsAsFactors=FALSE)
old.meta <- read.csv("~/Dropbox/COVID19/Data/Metadata FINAL 10122020.csv",
                     header=TRUE, stringsAsFactors=FALSE)
old.meta$sample_id[old.meta$sample_id %in% c("BGCV13_CV0201")] <- "BGCV06_CV0201"
old.meta$sample_id[old.meta$sample_id %in% c("BGCV06_CV0326")] <- "BGCV13_CV0326"

covid.meta$AgeRange <- covid.meta$Age
covid.meta$Status_on_day_collection_summary[covid.meta$Status_on_day_collection_summary %in% c("LPS_10hours")] <- "LPS"
covid.meta$Status_on_day_collection_summary[covid.meta$Status_on_day_collection_summary %in% c("LPS_90mins")] <- "LPS"

covid.meta <- merge(covid.meta[, !colnames(covid.meta) %in% c("Age")], old.meta[, c("sample_id", "patient_id", "Age")],
                    by='sample_id')

cell.freq.merge <- merge(cell.freq.df, covid.meta, by=c('sample_id'))
cell.freq.merge <- cell.freq.merge[!cell.freq.merge$Status_on_day_collection_summary %in% c("Non_covid"), ]
cell.freq.merge <- cell.freq.merge[!cell.freq.merge$patient_id %in% c("CV0198"), ]
# remove doublets, etc
cell.freq.merge <- cell.freq.merge[!cell.freq.merge$CellType %in% c("Doublets:Bcell", "Doublets:Platelet", "Doublets", "NK", "ILCs"), ]
```


```{r, warning=FALSE, message=FALSE, fig.height=2.95, fig.width=9.15}
group.cols <- c("#2ca02c", "#1f77b4", "#9467bd", "#fed976", "#fd8d3c", "#e31a1c", "#800026", "#252525")
names(group.cols) <- c("Healthy", "LPS", "Non_covid", "Asymptomatic", "Mild", "Moderate", "Severe", "Critical")

cell.freq.merge$Status_on_day_collection_summary <- factor(cell.freq.merge$Status_on_day_collection_summary,
                                            levels=c("Healthy", "Asymptomatic", "Mild", 
                                                     "Moderate", "Severe", "Critical", "LPS", "Non_covid"))
```


```{r}
write.table(cell.freq.merge,
            file="~/Dropbox/COVID19/Data/Updated/Tcell_proportions.tsv",
            sep="\t", quote=FALSE, row.names=FALSE)
```

How do these compare to the previous frequencies?

```{r, fig.height=9.95, fig.width=10.95}
old.freqs <- read.table("~/Dropbox/COVID19/Data/Tcell_proportions.tsv",
                        sep="\t", header=TRUE, stringsAsFactors = FALSE)
old.freqs$sample_id[old.freqs$sample_id %in% c("BGCV13_CV0201")] <- "BGCV06_CV0201"
old.freqs$sample_id[old.freqs$sample_id %in% c("BGCV06_CV0326")] <- "BGCV13_CV0326"

old.freqs <- old.freqs[, c("sample_id", "CellType", "Freq")]
colnames(old.freqs) <- c("sample_id", "CellType", "old.Freq")

comp.freqs <- merge(cell.freq.merge, old.freqs, by=c('sample_id', 'CellType'))
comp.freqs$Switch <- comp.freqs$sample_id %in% c("BGCV06_CV0201", "BGCV13_CV0326")

ggplot(comp.freqs, aes(x=Freq, y=old.Freq, colour=Switch)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_manual(values=c("black", "red")) +
    facet_wrap(~CellType, scales="free") +
    NULL
```


```{r, warning=FALSE, message=FALSE, fig.height=5.95, fig.width=10.15}
ggplot(cell.freq.merge[cell.freq.merge$Collection_Day %in% c("D0") &
                           !cell.freq.merge$CellType %in% c("NK", "Prolif.NK", "ILCs", "B_naive", "CD14_mono",
                                                            "DC_prolif", "DC3", "HSC", "ILC1_3", "ILC2", "Mono_prolif",
                                                            "NK_16hi", "NK_56hi", "NK_prolif", "pDC", "Plasmablast",
                                                            "Platelets", "RBC",
                                                            "Doublets:Bcell", "Doublets:Platelet", "Doublets"), ],
       aes(x=Status_on_day_collection_summary, y=Freq, fill=Status_on_day_collection_summary)) +
    geom_boxplot() +
    theme_cowplot() +
    facet_wrap(~CellType, scales="free_y", ncol=4) +
    scale_fill_manual(values=group.cols) +
    expand_limits(y=c(0)) +
    theme(axis.text.x=element_blank(),
          strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14)) +
    labs(x="Severity Group", y="Proportion") +
    guides(fill=guide_legend(title="Severity")) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcells_proportions-boxplot.pdf",
           height=5.95, width=10.15, useDingbats=FALSE) +
    NULL
```

For the figures these need to be a filled barchart (?!). Focus in on the Tfh-like cells.

```{r, warning=FALSE, message=FALSE, fig.height=2.15, fig.width=3.55}
ggplot(cell.freq.merge[cell.freq.merge$Collection_Day %in% c("D0") &
                           cell.freq.merge$CellType %in% c("CD4.Tfh"), ],
       aes(x=Status_on_day_collection_summary, y=Freq, fill=Status_on_day_collection_summary)) +
    geom_boxplot() +
    theme_cowplot() +
    facet_wrap(~CellType, scales="free_y") +
    scale_fill_manual(values=group.cols) +
    expand_limits(y=c(0)) +
    theme(axis.text.x=element_blank(),
          strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14)) +
    labs(x="Severity Group", y="Proportion") +
    guides(fill=guide_legend(title="Severity")) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcells_proportions_Tfh-boxplot.pdf",
           height=2.15, width=3.55, useDingbats=FALSE) +
    NULL
```

Run a LM comparing categories.

```{r, warning=FALSE, message=FALSE, fig.height=2.15, fig.width=3.55}
ggplot(cell.freq.merge[cell.freq.merge$Collection_Day %in% c("D0") &
                           cell.freq.merge$CellType %in% c("CD4.Tfh"), ],
       aes(x=Status_on_day_collection_summary, y=Freq, fill=Sex)) +
    geom_boxplot() +
    theme_cowplot() +
    facet_wrap(~CellType, scales="free_y") +
    scale_fill_colorblind() +
    expand_limits(y=c(0)) +
    theme(axis.text.x=element_blank(),
          strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14)) +
    labs(x="Severity Group", y="Proportion") +
    guides(fill=guide_legend(title="Severity")) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcells_proportions_Tfh-byGender_boxplot.pdf",
           height=2.15, width=3.55, useDingbats=FALSE) +
    NULL
```

Compare healthy vs. asymptomatic, and asymptomatic > critical.

```{r, warning=FALSE, message=FALSE}
healthy.tfh <- cell.freq.merge$Freq[cell.freq.merge$CellType %in% c("CD4.Tfh") &
                                        cell.freq.merge$Status_on_day_collection_summary %in% c("Healthy") &
                                        cell.freq.merge$Collection_Day %in% c("D0")]
asymp.tfh <- cell.freq.merge$Freq[cell.freq.merge$CellType %in% c("CD4.Tfh") &
                                        cell.freq.merge$Status_on_day_collection_summary %in% c("Asymptomatic") &
                                        cell.freq.merge$Collection_Day %in% c("D0")]

tfh.utest <- wilcox.test(x=healthy.tfh, y=asymp.tfh, alternative="two.sided")
tfh.utest
```

I should model the counts, normalized by the total numbers of captured cells.

```{r}
tfh.lm.list <- list()
covid.tfh.merge <- cell.freq.merge[!cell.freq.merge$Status_on_day_collection_summary %in% c("Healthy"), ]
covid.tfh.merge$OrderedStatus <- ordered(covid.tfh.merge$Status_on_day_collection_summary,
                                         levels=c("Asymptomatic", "Mild", "Moderate", "Severe", "Critical"))
covid.tfh.merge$Days_from_onset <- as.numeric(covid.tfh.merge$Days_from_onset)

c.types <- c("CD4.Tfh")

for(i in seq_along(c.types)){
    i.c <- c.types[i]
    
    i.lm.df <- data.frame("sample_id"=rownames(cell.freq.tab), "Count"=cell.freq.tab[, i.c])
    i.lm.df <- merge(i.lm.df, covid.tfh.merge[covid.tfh.merge$CellType %in% i.c, ], by='sample_id')
    
    # i.tfh.lm <- glm(Count ~ Sex + Age + Site + OrderedStatus,
    #                data=i.lm.df, family=poisson(link="log"))
    i.tfh.lm <- glm.nb(Count ~ Sex + Age + Site + OrderedStatus, data=i.lm.df, init.theta=1)
    
    i.lm.res <- summary(i.tfh.lm)
    tfh.lm.list[[i.c]] <- data.frame("CellType"=rep(i.c, nrow(i.lm.res$coefficients)),
                                     "Beta"=i.lm.res$coefficients[, 1],
                                     "SE"=i.lm.res$coefficients[, 2],
                                     "STAT"=i.lm.res$coefficients[, 3],
                                     "Pvalue"=i.lm.res$coefficients[, 4],
                                     "Predictor"=rownames(i.lm.res$coefficients))
}

tfh.lm.df <- do.call(rbind.data.frame, tfh.lm.list)
tfh.lm.df$Predictor <- gsub(tfh.lm.df$Predictor, pattern="OrderedStatus", replacement="Severity")
tfh.lm.df$Predictor <- gsub(tfh.lm.df$Predictor, pattern="Male", replacement="")
tfh.lm.df$Predictor <- gsub(tfh.lm.df$Predictor, pattern="Site", replacement="")
tfh.lm.df <- tfh.lm.df[!tfh.lm.df$Predictor %in% c("(Intercept)"), ]
tfh.lm.df$P.Adjust <- p.adjust(tfh.lm.df$Pvalue)
```


```{r, warning=FALSE, message=FALSE, fig.height=3.95, fig.width=4.95}
ggplot(tfh.lm.df, aes(x=Predictor, y=Beta, fill=Pvalue < 0.05)) +
    geom_hline(yintercept=0, lty=2, col='grey70') +
    geom_errorbar(aes(ymin=Beta-SE, ymax=Beta+SE)) +
    geom_point(shape=22, size=3) +
    theme_cowplot() +
     theme(strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14)) +
    coord_flip() +
    scale_fill_manual(values=c("blue", "orange")) +
    facet_wrap(~CellType, scales="free_x")  + 
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Tfh_props-LM.pdf",
           height=3.95, width=4.95, useDingbats=FALSE)
```


```{r, warning=FALSE, message=FALSE}
cellfreq.df <- cell.freq.merge %>% group_by(Status_on_day_collection_summary, CellType) %>% summarise(Mean = mean(Freq))
cellfreq.df$Status_on_day_collection_summary <- factor(cellfreq.df$Status_on_day_collection_summary,
                                        levels=c("Healthy", "Asymptomatic", "Mild", 
                                                 "Moderate", "Severe", "Critical", "LPS"))
```

Create a new colour palette.

```{r}
cell.order <- c("CD4.Naive", "CD4.CM", "CD4.EM", "CD4.IL22", "CD4.Prolif", "CD4.Th1", "CD4.Th2", "CD4.Th17", "CD4.Tfh",
                "Treg", "CD8.Naive", "CD8.Activated", "CD8.Prolif", "CD8.CM", "CD8.TE", "CD8.EM", "gdT", "MAIT", "NKT")

all.qual.cols <- brewer.pal.info[brewer.pal.info$category %in% c("qual") & brewer.pal.info$colorblind, ]
col_vector = unlist(mapply(brewer.pal, all.qual.cols$maxcolors, rownames(all.qual.cols)))

# cell.cols <- col_vector[c(1:7, 9:19)]
cell.cols <- col_vector[c(1:17, 19, 20)]
names(cell.cols) <- cell.order
```


```{r}
pie(rep(1, 18), col=cell.cols)
```


```{r, warning=FALSE, message=FALSE, fig.height=4.25, fig.width=6.95}
# n.cells <- length(cell.order)
# cell.cols <- colorRampPalette(pal_futurama()(12))(n.cells)
# names(cell.cols) <- cell.order

cellfreq.df$CellType <- factor(cellfreq.df$CellType,
                               levels=cell.order)

ggplot(cellfreq.df,
       aes(x=Status_on_day_collection_summary, y = Mean, fill=CellType))+ 
    geom_bar(position="fill", stat="identity", width = 0.9, colour = "black")+
    scale_fill_manual(values = cell.cols) +
    theme(aspect.ratio = 1/1.5, 
          axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1, size = 14, colour = "black"),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          axis.text.y = element_text(size = 14, colour = "black"),
          legend.key.size=unit(0.4, "cm"),
          axis.title.x=element_blank(), axis.title.y=element_blank(),
          legend.text = element_text(size = 14), legend.title=element_text(size=14),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(fill=guide_legend(title="Cell type", ncol=1)) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_barchart.pdf",
           height=4.25, width=6.95, useDingbats=FALSE)
```

I have a misgiving about this, as it masks the distribution of the proportions - maybe a series of filled boxplots, e.g. a waterfall?

```{r, warning=FALSE, message=FALSE, fig.height=5.25, fig.width=12.95}
cell.freq.merge$CellType <- factor(cell.freq.merge$CellType,
                                   levels=cell.order)

ggplot(cell.freq.merge,
       aes(x=sample_id, y = Freq, fill=CellType))+ 
    geom_bar(position="fill", stat="identity", width = 0.8, colour = "black")+
    scale_fill_manual(values = cell.cols) +
    facet_grid(. ~ Status_on_day_collection_summary, scales="free_x", space="free") +
    theme(axis.text.x = element_blank(),
          panel.spacing=unit(0, "lines"),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          axis.text.y = element_text(size = 18),
          axis.title.x=element_blank(), axis.title.y=element_blank(),
          axis.ticks.x=element_blank(),
          strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14, angle=90, colour='black'),
          legend.text = element_text(size = 18), legend.title=element_text(size=18),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    # guides(fill=guide_legend(title="Cell type")) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_barchart-full.pdf",
           height=5.25, width=8.95, useDingbats=FALSE) +
    NULL
```

Make dot plots.

```{r, warning=FALSE, message=FALSE}
clust.model.matrix <- model.matrix(~ 0 + Sub.Annotation, data=annot.merge)
rownames(clust.model.matrix) <- annot.merge$CellID

gene.goi.by.cluster <- t(clust.model.matrix) %*% as.matrix(annot.merge[, setdiff(colnames(goi.df), colnames(tcell.merge))])
gene.ave.by.label <- as.data.frame(apply(gene.goi.by.cluster, 2, function(X) X/colSums(clust.model.matrix)))
rownames(gene.ave.by.label) <- gsub(rownames(gene.ave.by.label), pattern="Sub\\.Annotation", replacement="")

gene.goi.by.cluster.bin <- t(clust.model.matrix) %*% as.matrix(annot.merge[, setdiff(colnames(goi.df), colnames(tcell.merge))] > 0)
gene.bin.by.label <- as.data.frame(apply(gene.goi.by.cluster.bin, 2, function(X) X/sum(X)))
gene.bin.by.label[is.na(gene.bin.by.label)] <- 0
rownames(gene.bin.by.label) <- gsub(rownames(gene.bin.by.label), pattern="Sub\\.Annotation", replacement="")
```


```{r, message=FALSE, warning=FALSE}
gene.ave.label.df <- as.data.frame(apply(gene.ave.by.label, 2, FUN=function(XP) XP/max(XP)))
gene.ave.label.df$Sub.Annotation <- rownames(gene.ave.label.df)
gene.ave.label.melt <- melt(gene.ave.label.df, id.vars='Sub.Annotation')
colnames(gene.ave.label.melt) <- c("Sub.Annotation", "Gene", "AveExprs")

gene.bin.label.df <- gene.bin.by.label
gene.bin.label.df$Sub.Annotation <- rownames(gene.bin.label.df)
gene.bin.label.melt <- melt(gene.bin.label.df, id.vars='Sub.Annotation')
colnames(gene.bin.label.melt) <- c("Sub.Annotation", "Gene", "PropExprs")
```


```{r, message=FALSE, warning=FALSE, fig.height=4.65, fig.width=8.95}
dot.plot.df <- merge(gene.ave.label.melt, gene.bin.label.melt, by=c('Sub.Annotation', 'Gene'))
dot.plot.df$Gene <- as.character(dot.plot.df$Gene)

dot.plot.genes <- c("CD3G", "CD8A", "CD4", "CCR7", "CD27", "CD28", "TOX", "CTLA4", "IFNG", "TBX21",
                    "PDCD1", "GZMB", "RORC", "IKZF2", "GATA3", "TNFRSF9", "IL7R", "KLRG1",
                    "TRAV1.2", "TRDV2", "TRGV9", "CD40LG", "RORC", "NCAM1", "CCR6", 
                    "CXCR5", "HLA.DRB1", "LAG3", "FOXP3", "MKI67", "NCR1", "GARP", "FCGR3A")
gene.cluster <- hclust(dist(t(gene.ave.by.label[, intersect(colnames(gene.ave.by.label), dot.plot.genes)])))$order

# manually set the gene order
gene.order <- c("CD3G", "CCR7", "CD27", "CD4", "CD28", "TNFRSF9", "CCR6", "CD40LG", "MKI67", "TBX21", "GATA3", "RORC", "IKZF2",
                "FOXP3", "CTLA4", "PDCD1", "CXCR5", "CD8A", "GZMB", "HLA.DRB1", "IFNG", "LAG3", "TOX", "IL7R", "KLRG1", "TRDV2", 
                "TRGV9", "TRAV1.2", "NCAM1", "NCR1", "FCGR3A")

dot.plot.df <- dot.plot.df[dot.plot.df$Gene %in% dot.plot.genes, ]
dot.plot.df$Gene <- factor(dot.plot.df$Gene,
                           levels=gene.order)

dot.plot.df <- dot.plot.df[dot.plot.df$Sub.Annotation %in% cell.order, ]
dot.plot.df$Sub.Annotation <- factor(dot.plot.df$Sub.Annotation,
                                     levels=rev(cell.order))

ggplot(dot.plot.df,
       aes(x=Gene, y=Sub.Annotation, colour=AveExprs, size=PropExprs*100)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_gradient(low='grey70', high='blue') +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1, colour='black', size=14),
          axis.text.y=element_text(colour='black', size=14),
          legend.text=element_text(size=14),
          legend.title=element_text(size=14),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(colour=guide_colorbar(title='Mean\nExpression'),
           size=guide_legend(title='% Express')) +
    labs(x="Gene", y="Cell type") +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_ext_dotplot-genes.pdf",
           height=4.65, width=8.95, useDingbats=FALSE)
```

Plot the cytokine profiles to figure out if Th1/2/17 dominate (or all of them).

```{r, message=FALSE, warning=FALSE, fig.height=4.15, fig.width=7.0}
cytokine.dot.plot.df <- merge(gene.ave.label.melt, gene.bin.label.melt, by=c('Sub.Annotation', 'Gene'))
cytokine.dot.plot.df$Gene <- as.character(cytokine.dot.plot.df$Gene)

cytokine.genes <- intersect(c("IL2", "IL1A", "IL1B", "IL10", "IL22",  "TNF", "IFNG", "LTA",
                              "IL4", "IL5", "IL13", "IL17A", "IL17F", "IL21",
                              "IL12A", "IL12B", "IL25"), colnames(annot.merge))

cytokine.dot.plot.df <- cytokine.dot.plot.df[cytokine.dot.plot.df$Gene %in% cytokine.genes, ]
cytokine.dot.plot.df$Gene <- factor(cytokine.dot.plot.df$Gene,
                                    levels=cytokine.genes)

cytokine.dot.plot.df <- cytokine.dot.plot.df[cytokine.dot.plot.df$Sub.Annotation %in% cell.order, ]
cytokine.dot.plot.df$Sub.Annotation <- factor(cytokine.dot.plot.df$Sub.Annotation,
                                              levels=rev(cell.order))

ggplot(cytokine.dot.plot.df,
       aes(x=Gene, y=Sub.Annotation, colour=AveExprs, size=PropExprs*100)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_gradient(low='grey70', high='blue') +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1, colour='black', size=14),
          axis.text.y=element_text(colour='black', size=14),
          legend.text=element_text(size=14),
          legend.title=element_text(size=14),
          legend.key.size=unit(0.4, "cm"),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(colour=guide_colorbar(title='Mean\nExpression'),
           size=guide_legend(title='% Express')) +
    labs(x="Cytokine", y="Cell type") +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_ext_dotplot-cytokines.pdf",
           height=4.65, width=7.0, useDingbats=FALSE) +
    NULL
```

I want to see how these cytokines change over the course of severity.

```{r, warning=FALSE, message=FALSE}
cytokine.melt <- melt(annot.merge[, c("sample_id", "Status_on_day_collection_summary", "Sub.Annotation", "Collection_Day", "Sex", "Age", "CellID",
                                           cytokine.genes)],
                      variable.name="Cytokine", 
                      id.vars=c("sample_id", "Status_on_day_collection_summary", "Sub.Annotation", "Collection_Day", "Sex", "Age", "CellID"))
cytokine.means <- cytokine.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Cytokine) %>% summarise("Mean.Exprs"=mean(value))
cytokine.var <- cytokine.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Cytokine) %>% summarise("Var.Exprs"=var(value))
cytokine.se <- cytokine.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Cytokine) %>% summarise("SE.Exprs"=sqrt(var(value))/sqrt(sum(value >= 0)))

cytokine.df <- Reduce(x=list("mean"=cytokine.means, "var"=cytokine.var, "se"=cytokine.se),
                      f=function(x, y) merge(x, y, by=c('Status_on_day_collection_summary', 'Sub.Annotation', 'Cytokine')))
# cytokine.df <- merge(cytokine.df, covid.meta, by='sample_id')
 
# remove superflous or malignant samples
# cytokine.df <- cytokine.df[!cytokine.df$patient_id %in% c("CV0198"), ]
# cytokine.df <- cytokine.df[!cytokine.df$sample_id %in% c("BGCV01_CV0902"), ]
# cytokine.df <- cytokine.df[!cytokine.df$Status_on_day_collection_summary %in% c("Non_Covid"), ]

cytokine.df$D0_satus_summary <- factor(cytokine.df$Status_on_day_collection_summary,
                                       levels=c("Healthy", "Asymptomatic", "Mild",
                                                "Moderate", "Severe", "Critical", "LPS"))
```


Maybe visualise this as a heatmap?

```{r, fig.height=7.15, fig.width=7.95}
cytokine.df <- cytokine.df[!cytokine.df$Sub.Annotation %in% c("NK", "ILCs", "Doublets:Bcell", "Doublets", "Doublets:Platelet") &
                               !is.na(cytokine.df$D0_satus_summary), ]

ggplot(cytokine.df[!cytokine.df$Cytokine %in% c("IL13", "IL22", "IL12A", "IL17A", "IL17F", "IL10", "IL6"), ], 
       aes(x=D0_satus_summary, y=Cytokine, fill=Mean.Exprs)) +
    geom_tile() +
    facet_wrap(~Sub.Annotation) +
    scale_fill_viridis(option="magma") +
    theme_cowplot() +
    guides(fill=guide_colourbar(title="Mean Expression")) +
    labs(y="Cytokine Gene", x="Severity") +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1),
          strip.background=element_rect(fill='white', colour='white')) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_cytokines_heatmap.pdf",
           height=7.15, width=7.95, useDingbats=FALSE) +
    NULL
```


What about exhaustion markers?


```{r, warning=FALSE, message=FALSE}
exhaustion.genes <- c("TOX", "TIGIT", "LAG3", "HAVCR2", "PDCD1", "FOXP3", "MKI67")
exhaustion.melt <- melt(annot.merge[, c("sample_id", "Status_on_day_collection_summary", "Sub.Annotation", "Collection_Day", "Sex", "Age", "CellID",
                                           exhaustion.genes)],
                      variable.name="Gene", 
                      id.vars=c("sample_id", "Status_on_day_collection_summary", "Sub.Annotation", "Collection_Day", "Sex", "Age", "CellID"))
exhaustion.means <- exhaustion.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Gene) %>% summarise("Mean.Exprs"=mean(value))
exhaustion.var <- exhaustion.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Gene) %>% summarise("Var.Exprs"=var(value))
exhaustion.se <- exhaustion.melt %>% group_by(Status_on_day_collection_summary, Sub.Annotation, Gene) %>% summarise("SE.Exprs"=sqrt(var(value))/sqrt(sum(value >= 0)))

exhaustion.df <- Reduce(x=list("mean"=exhaustion.means, "var"=exhaustion.var, "se"=exhaustion.se),
                      f=function(x, y) merge(x, y, by=c('Status_on_day_collection_summary', 'Sub.Annotation', 'Gene')))
# exhaustion.df <- merge(exhaustion.df, covid.meta, by='sample_id')
 
# remove superflous or malignant samples
# exhaustion.df <- exhaustion.df[!exhaustion.df$patient_id %in% c("CV0198"), ]
# exhaustion.df <- exhaustion.df[!exhaustion.df$sample_id %in% c("BGCV01_CV0902"), ]
# exhaustion.df <- exhaustion.df[!exhaustion.df$Status_on_day_collection_summary %in% c("Non_Covid"), ]

exhaustion.df$D0_satus_summary <- factor(exhaustion.df$Status_on_day_collection_summary,
                                       levels=c("Healthy", "Asymptomatic", "Mild",
                                                "Moderate", "Severe", "Critical", "LPS"))
```


```{r, fig.height=5.45, fig.width=9.95}
exhaustion.df <- exhaustion.df[!exhaustion.df$Sub.Annotation %in% c("NK", "Prolif.NK", "ILCs", "B_naive", "CD14_mono",
                                                            "DC_prolif", "DC3", "HSC", "ILC1_3", "ILC2", "Mono_prolif",
                                                            "NK_16hi", "NK_56hi", "NK_prolif", "pDC", "Plasmablast",
                                                            "Platelets", "RBC",
                                                            "Doublets:Bcell", "Doublets:Platelet", "Doublets") &
                               !is.na(exhaustion.df$D0_satus_summary), ]

ggplot(exhaustion.df[!exhaustion.df$Gene %in% c("IL13", "IL22", "IL12A", "IL17A", "IL17F"), ], 
       aes(x=D0_satus_summary, y=Gene, fill=Mean.Exprs)) +
    geom_tile() +
    facet_wrap(~Sub.Annotation, nrow=3) +
    scale_fill_viridis(option="magma") +
    theme_cowplot() +
    guides(fill=guide_colourbar(title="Mean Expression")) +
    labs(x="Severity", "Gene") +
    theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1),
          strip.background=element_rect(fill='white', colour='white')) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_exhaustion_heatmap.pdf",
           height=5.45, width=9.95, useDingbats=FALSE) +
    NULL
```

Do the same for the proteins.

```{r, warning=FALSE, message=FALSE}
clust.model.matrix <- model.matrix(~ 0 + Sub.Annotation, data=annot.merge)
rownames(clust.model.matrix) <- annot.merge$CellID

goi.by.cluster <- t(clust.model.matrix) %*% as.matrix(annot.merge[, gsub(setdiff(colnames(prot.df), colnames(tcell.merge)),
                                                                              pattern="\\.x", replacement="")])
ave.by.label <- as.data.frame(apply(goi.by.cluster, 2, function(X) X/colSums(clust.model.matrix)))

rownames(ave.by.label) <- gsub(rownames(ave.by.label), pattern="Sub\\.Annotation", replacement="")
colnames(ave.by.label) <- gsub(colnames(ave.by.label), pattern="Prot\\.", replacement="")

goi.by.cluster.bin <- t(clust.model.matrix) %*% as.matrix(annot.merge[, gsub(setdiff(colnames(prot.df), colnames(tcell.merge)),
                                                                              pattern="\\.x", replacement="")] > 0.01)
bin.by.label <- as.data.frame(apply(goi.by.cluster.bin, 2, function(X) X/sum(X)))
bin.by.label[is.na(bin.by.label)] <- 0
rownames(bin.by.label) <- gsub(rownames(bin.by.label), pattern="Sub\\.Annotation", replacement="")
colnames(bin.by.label) <- gsub(colnames(bin.by.label), pattern="Prot\\.", replacement="")
```


```{r, message=FALSE, warning=FALSE}
ave.label.df <- as.data.frame(apply(ave.by.label, 2, FUN=function(XP) (XP-min(XP))/max(XP-min(XP))))
ave.label.df$Sub.Annotation <- rownames(ave.label.df)
ave.label.melt <- melt(ave.label.df, id.vars='Sub.Annotation')
colnames(ave.label.melt) <- c("Sub.Annotation", "Protein", "AveExprs")

bin.label.df <- bin.by.label
bin.label.df$Sub.Annotation <- rownames(bin.label.df)
bin.label.melt <- melt(bin.label.df, id.vars='Sub.Annotation')
colnames(bin.label.melt) <- c("Sub.Annotation", "Protein", "PropExprs")
```


```{r, message=FALSE, warning=FALSE, fig.height=5.15, fig.width=8.95}
protein.dot.plot.df <- merge(ave.label.melt, bin.label.melt, by=c('Sub.Annotation', 'Protein'))
protein.dot.plot.df$Protein <- as.character(protein.dot.plot.df$Protein)

dot.plot.prots <- c("CD3", "CD8", "CD4", "CCR7", "CD45RA", "CD45RO", "CD28", "CD27", "CTLA4", "CD56", "CD16",
                    "CD274", "CXCR3", "CD40LG", "ICOS", "PD1", "CD25", "LAMP1", "CXCR3", "CCR6", "IL7R", 
                    "CXCR5", "TCR_Va7.2", "TCR_Vg2", "TCR_Vg9", "TCR_Va24-Ja18", "CD62L", "TCR_Va24.Ja18")

protein.order <- c("CD3", "CD4", "CCR7", "CD45RA", "CD45RO", "CD27", "CD28", "CD62L", "CD25", "CTLA4",
                   "LAMP1", "CCR6", "IL7R",
                   "CXCR5", "CD40LG", "ICOS", "CXCR3", "CD8", "PD1", "CD274", "TCR_Vg9", "TCR_Vg2",
                   "TCR_Va7.2", "TCR_Va24.Ja18", "CD56", "CD16")

protein.dot.plot.df <- protein.dot.plot.df[protein.dot.plot.df$Protein %in% dot.plot.prots, ]
protein.dot.plot.df$Protein <- factor(protein.dot.plot.df$Protein,
                                      levels=protein.order)

protein.dot.plot.df <- protein.dot.plot.df[protein.dot.plot.df$Sub.Annotation %in% cell.order, ]
protein.dot.plot.df$Sub.Annotation <- factor(protein.dot.plot.df$Sub.Annotation,
                                             levels=rev(cell.order))

ggplot(protein.dot.plot.df, 
       aes(x=Protein, y=Sub.Annotation, colour=AveExprs, size=PropExprs*100)) +
    geom_point() +
    theme_cowplot() +
    scale_colour_gradient(low='grey70', high=darken('red')) +
     theme(axis.text.x=element_text(angle=90, vjust=0.5, hjust=1, colour='black', size=14),
          axis.text.y=element_text(colour='black', size=14),
          legend.text=element_text(size=14),
          legend.title=element_text(size=14),
          panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
          panel.background = element_blank(), axis.line = element_line(colour = "black")) +
    guides(colour=guide_colorbar(title='Mean\nExpression'),
           size=guide_legend(title='% Express')) +
    labs(x="Protein", y="Cell type") +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_ext_dotplot-protein.pdf",
           height=5.15, width=8.95, useDingbats=FALSE)
```

I also want to see some of the CD8 sub-phenotype mRNA and protein expression, namely _KLRG1_ and _CD217_ (_IL7R_).

```{r, warning=FALSE, message=FALSE, fig.height=5.95, fig.width=11.95}
repeat.samps <- covid.meta$patient_id[duplicated(covid.meta$patient_id)]
cell.freq.merge$Day <- ordered(cell.freq.merge$Collection_Day,
                               levels=c("D0", "D7", "D9", "D12", "D13", "D28"))

ggplot(cell.freq.merge[cell.freq.merge$patient_id %in% repeat.samps &
                           !cell.freq.merge$CellType %in% c("NK", "Prolif.NK", "ILCs", "Doublets:Bcell", "Doublets:Platelet", "Doublets") &
                           !cell.freq.merge$Status_on_day_collection_summary %in% c("Non_covid", "LPS"), ],
       aes(x=Day, y=Freq, fill=Status_on_day_collection_summary, group=patient_id)) +
    #geom_boxplot() +
    geom_line(aes(colour=Status_on_day_collection_summary)) +
    geom_point(shape=21, size=3) +
    theme_cowplot() +
    facet_wrap(~CellType, scales="free_y") +
    scale_fill_manual(values=group.cols) +
    scale_colour_manual(values=group.cols) +
    expand_limits(y=c(0)) +
    theme(strip.background=element_rect(fill='white', colour='white'),
          strip.text=element_text(size=14)) +
    labs(x="Day", y="Proportion") +
    guides(fill=guide_legend(title="Severity"),
           colour=FALSE) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcells_proportions-boxplot.pdf",
    #        height=5.95, width=11.15, useDingbats=FALSE) +
     NULL
```