File size: 17,197 Bytes
7718235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# visualize with dssp secondary structure 
library(ggplot2)
library(bio3d)
library(patchwork)
dssp.exec <- '/share/vault/Users/gz2294/miniconda3/bin/mkdssp'
genes <- c("P15056", "P07949", "P04637", "Q14654")
gene.names <- c("BRAF", "RET", "TP53","KCNJ11")
use.lw.df <- readRDS('figs/fig.5a.plot.RDS')
use.lw.df <- use.lw.df[use.lw.df$model == '1: PreMode',]

af2.seqs <- read.csv('genes.full.seq.csv', row.names = 1)
aa.dict <- c('L', 'A', 'G', 'V', 'S', 'E', 'R', 'T', 'I', 'D',
             'P', 'K', 'Q', 'N', 'F', 'Y', 'M', 'H', 'W', 'C')
log.dir <- '5genes.all.mut/PreMode/'
auc.dir <- './'
use.logits <- 'assemble.logits'
folds <- c(-1, 0:4)
source('./AUROC.R')
for (o in 1:length(genes)) {
  gene <- genes[o]
  use.lw <- c(F, use.lw.df$use.lw[use.lw.df$task.id==gene])
  names(use.lw) <- as.character(folds)
  prot_data <- drawProteins::get_features(gene)
  prot_data <- drawProteins::feature_to_dataframe(prot_data)
  secondary <- prot_data[prot_data$type %in% c("HELIX", "STRAND", "TURN"),]
  secondary.df <- data.frame()
  for (i in 1:dim(secondary)[1]) {
    sec.df <- data.frame(pos.orig = secondary$begin[i]:secondary$end[i],
                         alt = ".anno_secondary",
                         ANNO_secondary = secondary$type[i])
    secondary.df <- dplyr::bind_rows(secondary.df, sec.df)
  }
  #plot the AF2 predicted secondary.df and rsa
  gene.af2.file <- paste0("../data.files/af2.files/AF-",
                          gene, '-F', 1,
                          '-model_v4.pdb.gz')
  dssp.res <- dssp(read.pdb(gene.af2.file), 
                   exefile=dssp.exec)
  pdb.res <- read.pdb(gene.af2.file)
  plddt.res <- pdb.res$atom$b[pdb.res$calpha]
  af2.secondary <- rbind(cbind(as.data.frame(dssp.res$helix)[,1:4], type="HELIX"), 
                          cbind(as.data.frame(dssp.res$sheet), type="STRAND"), 
                           cbind(as.data.frame(dssp.res$turn), type="TURN"))
  for (i in 1:dim(af2.secondary)[1]) {
    sec.df <- data.frame(pos.orig = af2.secondary$start[i]:af2.secondary$end[i],
                         alt = ".anno_af2_secondary",
                         ANNO_secondary = af2.secondary$type[i])
    secondary.df <- dplyr::bind_rows(secondary.df, sec.df)
  }
  rsa.df <- data.frame(pos.orig=1:length(dssp.res$acc), alt = ".anno_af2_rsa", 
                       ANNO_RSA=(dssp.res$acc)/max(dssp.res$acc))
  plddt.df <- data.frame(pos.orig=1:length(plddt.res), alt = ".anno_af2_pLDDT", 
                         ANNO_pLDDT=plddt.res)
  #plot the domain types that only have one row of description
  others <- prot_data[prot_data$description != "NONE",]
  others <- others[!others$type %in% c("VARIANT", "MUTAGEN", "CONFLICT", "VAR_SEQ", "CHAIN"),]
  others$type[others$type=="MOD_RES"] <- 'Post Transl. Mod.'
  others$type[others$type=="DOMAIN"] <- others$description[others$type=="DOMAIN"]
  others$type <- tolower(others$type)
  unique.df <- data.frame()
  for (i in 1:dim(others)[1]) {
    if(i==1){
      if(!identical(others$type[i],others$type[i+1])){
        unq.df <- data.frame(pos.orig = others$begin[i]:others$end[i],
                             alt = paste0(".", others$type[i]),
                             ANNO_domain_type = others$type[i])
        unique.df <- dplyr::bind_rows(unique.df, unq.df)
      }
    }else{
      if(!identical(others$type[i],others$type[i+1]) && !identical(others$type[i],others$type[i-1])){
        unq.df <- data.frame(pos.orig = others$begin[i]:others$end[i],
                             alt = paste0(".", others$type[i]),
                             ANNO_domain_type = others$type[i])
        unique.df <- dplyr::bind_rows(unique.df, unq.df)
      }
    }
  }
  #plot the other domain types that have multiple kinds of descriptions
  multiple.df <- data.frame()
  for (i in 1:dim(others)[1]) {
    if(identical(others$type[i],others$type[i+1]) | identical(others$type[i],others$type[i-1])){
      mult.df <- data.frame(pos.orig = others$begin[i]:others$end[i],
                            alt = paste0(".", others$type[i]),
                            ANNO_domain_type = others$description[i])
      multiple.df <- dplyr::bind_rows(multiple.df, mult.df)
    }
  }
  
  gene.seq <- af2.seqs$seq[af2.seqs$uniprotID==gene]
  xlabs <- strsplit(gene.seq, "")[[1]]
  xlabs <- paste0(1:nchar(gene.seq), ":", xlabs)
  
  assemble.logits <- 0
  weighted.assemble.logits <- 0
  auc.weights <- NULL
  all.training <- data.frame()
  patch.plot <- list()
  for (fold in folds) {
    if (fold == -1) {
      gene.result <- read.csv(paste0(log.dir, gene, '.pretrain.csv'), row.names = 1)
      pretrain.result <- gene.result
      training.file <- read.csv(paste0('../data.files/ICC.seed.0/', gene, '/training.csv'))[,c("HGNC", "pos.orig", "ref", "alt", "score", "data_source")]
      testing.file <- read.csv(paste0('../data.files/ICC.seed.0/', gene, '/testing.csv'))[,c("HGNC", "pos.orig", "ref", "alt", "score", "data_source")]
      training.file$score[training.file$score!=0] <- 1
      testing.file$score[testing.file$score!=0] <- 1
      all.logits <- matrix(NA, nrow = dim(gene.result)[1], ncol = 0)
      all.mean.logits <- matrix(NA, nrow = dim(gene.result)[1], ncol = 5)
      colnames(all.mean.logits) <- paste0('model.', 0:4)
    } else {
      if (use.lw[as.character(fold)]) {
        gene.result <- read.csv(paste0(log.dir, gene, '.large.window.fold.', fold, '.4fold.csv'), row.names = 1)
      } else {
        gene.result <- read.csv(paste0(log.dir, gene, '.fold.', fold, '.4fold.csv'), row.names = 1)
      }
      training.file <- read.csv(paste0('../data.files/ICC.seed.', fold, '/', gene, '/training.csv'))[,c("HGNC", "pos.orig", "ref", "alt", "score", "data_source")]
      testing.file <- read.csv(paste0('../data.files/ICC.seed.', fold, '/', gene, '/testing.csv'))[,c("HGNC", "pos.orig", "ref", "alt", "score", "data_source")]
      training.file <- training.file[training.file$score %in% c(-1, 0, 1),]
      testing.file <- testing.file[testing.file$score %in% c(-1, 0, 1),]
      auc <- use.lw.df$tr.auc[use.lw.df$fold == fold & use.lw.df$task.id == gene]
      auc.weights <- c(auc.weights, auc)
      all.logits <- cbind(all.logits, gene.result[,paste0('logits.FOLD.', 0:3)])
      all.mean.logits[,fold+1] <- rowMeans(gene.result[,paste0('logits.FOLD.', 0:3)])
    }
    if (!"logits" %in% colnames(gene.result) | fold != -1) {
      source('~/Pipeline/AUROC.R')
      logits.gof.lof <- rowMeans(gene.result[,paste0('logits.FOLD.', 0:3)])
      logits.gof <- (1 - logits.gof.lof)
      logits.lof <- logits.gof.lof
      logits <- cbind(pretrain.result$logits, logits.lof, logits.gof)
      gene.result$logits.0 <- pretrain.result$logits
      gene.result$logits.1 <- logits.lof
      gene.result$logits.2 <- logits.gof
      # average logits
      assemble.logits <- assemble.logits + logits
      weighted.assemble.logits <- weighted.assemble.logits + logits * auc
      gene.result[,"logits.2/logits.1*logits.0"] <- (gene.result$logits.2 - gene.result$logits.1) * gene.result$logits.0
      ps <- list()
      col.to.plot <- paste0("logits.", c(0:2, "2/logits.1*logits.0"))
      for (j in 1:4) {
        ps[[j]] <- ggplot() +
          geom_tile(data=gene.result, aes_string(x="pos.orig", y="alt", fill=col.to.plot[j])) + 
          scale_fill_gradientn(colors = c("light blue", "white", "pink"), na.value = 'grey') + labs(fill=col.to.plot[j]) +
          scale_x_continuous(breaks=seq(0, nchar(gene.seq), 50), minor_breaks = seq(0, nchar(gene.seq), 10)) +
          ggnewscale::new_scale_fill() +
          geom_tile(data=training.file, aes(x=pos.orig, y=alt, fill=score)) +
          scale_fill_gradientn(colors = c("blue", "white", "red")) +
          ggnewscale::new_scale_fill() +
          geom_tile(data=secondary.df, aes(x=pos.orig, y=alt, fill=ANNO_secondary, width=1)) +
          ggnewscale::new_scale_fill() +
          geom_tile(data=unique.df, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1),show.legend = F) +
          ggnewscale::new_scale_fill() +
          geom_tile(data=multiple.df, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1),show.legend = F) +
          theme_bw() + theme(legend.position="bottom", legend.direction="vertical") +
          ggtitle(gene.names[o]) + ggeasy::easy_center_title()
      }
      p <- ps[[2]] + ps[[3]] + ps[[4]] + plot_layout(nrow = 1)
    } else {
      p <- ggplot() +
        geom_tile(data=gene.result, aes(x=pos.orig, y=alt, fill=logits)) + 
        scale_fill_gradientn(colors = c("light blue", "white", "pink"), na.value = 'grey') +
        scale_x_continuous(breaks=seq(0, nchar(gene.seq), 50), minor_breaks = seq(0, nchar(gene.seq), 10)) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=training.file, aes(x=pos.orig, y=alt, fill=score)) +
        scale_fill_gradientn(colors = c("blue", "white", "red")) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=secondary.df, aes(x=pos.orig, y=alt, fill=ANNO_secondary, width=1)) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=unique.df, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1),show.legend = F) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=multiple.df, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1),show.legend = F) +
        theme_bw() + theme(legend.position="bottom", legend.direction="vertical") +
        ggtitle(gene.names[o]) + ggeasy::easy_center_title()
    }
    if (fold != -1) {
      patch.plot[[fold+1]] <- p
      all.training <- dplyr::bind_rows(all.training, training.file, testing.file)
    } else {
      all.pretrain <- dplyr::bind_rows(training.file, testing.file)
    }
  }
  assemble.logits <- assemble.logits / (length(folds) - 1)
  weighted.assemble.logits <- weighted.assemble.logits / sum(auc.weights)
  # plot assemble.logits auc and weighted.assembl.logits auc
  all.training$unique.id <- paste0(gene, ":", all.training$ref, all.training$pos.orig, all.training$alt)
  all.training <- all.training[!duplicated(all.training$unique.id),]
  all.training$assemble.logits <- rowMeans(all.logits[match(all.training$unique.id, gene.result$unique.id),])
  if (length(weighted.assemble.logits) != 0) {
    all.training$weighted.assemble.logits <- weighted.assemble.logits[match(all.training$unique.id, gene.result$unique.id)]
  }
  all.training.logits <- all.logits[match(all.training$unique.id, gene.result$unique.id),]
  library(caret)
  train.score <- all.training$score[all.training$score%in%c(-1,1)] * 0.5 + 0.5
  table(as.factor(train.score))
  set.seed(0)
  unregister_dopar <- function() {
    env <- foreach:::.foreachGlobals
    rm(list=ls(name=env), pos=env)
  }
  unregister_dopar()
  # only fit model on pathogenic variants, remove benign
  meta_model_fit <- train(all.training.logits[all.training$score %in% c(-1,1),], 
                          as.factor(train.score))
  saveRDS(meta_model_fit, file = paste0(log.dir, gene, '.meta.RDS'))
  meta.logits <- predict(meta_model_fit, all.logits, type = 'prob')[,2]
  all.training$meta.logits <- meta.logits[match(all.training$unique.id, gene.result$unique.id)]
  # add colnames
  gene.result$assemble.logits <- assemble.logits
  if (length(weighted.assemble.logits) != 0) {
    gene.result$weighted.assemble.logits <- weighted.assemble.logits
  }
  gene.result$meta.logits <- meta.logits
  gene.result$pretrain.logits <- pretrain.result$logits
  for (fold in 0:4) {
    gene.result[,paste0('fold.', fold, '.logits')] <- all.mean.logits[,fold+1]
  }
  gene.result$all.logits <- all.logits
  if (use.logits=="assemble.logits") {
    assemble.auc <- plot.AUC(all.training$score[all.training$score %in% c(-1, 1)], 
                             all.training$assemble.logits[all.training$score %in% c(-1, 1)])
    print(assemble.auc$auc)
    if (!is.null(dim(assemble.logits))) {
      gene.result$logits.0 <- assemble.logits[,1]
      gene.result$logits.1 <- assemble.logits[,2]
      gene.result$logits.2 <- assemble.logits[,3]
      gene.result$logits <- NULL
    } else {
      gene.result$logits <- assemble.logits
    }
  } else if (use.logits=="meta.logits") {
    meta.auc <- plot.AUC(all.training$score[all.training$score %in% c(-1, 1)],
                         1-all.training$meta.logits[all.training$score %in% c(-1, 1)])
    print(meta.auc$auc)
    gene.result$logits <- NULL
    gene.result$logits.1 <- 1-meta.logits
    gene.result$logits.0 <- pretrain.result$logits
    gene.result$logits.2 <- meta.logits
  } else if (use.logits=="weighted.assemble.logits") {
    weighted.assemble.auc <- plot.AUC(all.training$score[all.training$score %in% c(-1, 1)], 
                                      all.training$weighted.assemble.logits[all.training$score %in% c(-1, 1)])
    print(weighted.assemble.auc$auc)
    gene.result$logits <- NULL
    gene.result$logits.1 <- 1-weighted.assemble.logits
    gene.result$logits.0 <- pretrain.result$logits
    gene.result$logits.2 <- weighted.assemble.logits
  } else if (use.logits=="best.logits") {
    best.logits <- all.logits[,which.max(auc.weights)]
    all.training$best.logits <- best.logits[match(all.training$unique.id, gene.result$unique.id)]
    best.auc <- plot.AUC(all.training$score[all.training$score %in% c(-1, 1)], 
                         all.training$best.logits[all.training$score %in% c(-1, 1)])
    print(best.auc$auc)
    gene.result$logits <- NULL
    gene.result$logits.1 <- 1-best.logits
    gene.result$logits.0 <- pretrain.result$logits
    gene.result$logits.2 <- best.logits
  }
  if (!"logits" %in% colnames(gene.result)) {
    gene.result[,"(logits.2-logits.1)*logits.0"] <- (gene.result$logits.2 - gene.result$logits.1) * gene.result$logits.0
    write.csv(gene.result, paste0(log.dir, gene, '.logits.csv'))
    gene.result.to.plot <- gene.result
    all.training.to.plot <- all.training
    secondary.df.to.plot <- secondary.df
    unique.df.to.plot <- unique.df
    multiple.df.to.plot <- multiple.df
    ps <- list()
    col.to.plot <- c(paste0("logits.", c(0:2)), "(logits.2-logits.1)*logits.0")
    fill.name <- c("Patho", "GoF", "LoF", "GoF-LoF")
    for (j in 1:4) {
      if (j == 1) {
        all.training.to.plot.plot <- all.pretrain
        col.fill.limits <- c(0, 1)
      } else {
        all.training.to.plot.plot <- all.training.to.plot
        col.fill.limits <- c(-1, 1)
      }
      all.training.to.plot.plot$label <- all.training.to.plot.plot$score
      ps[[j]] <- ggplot() +
        geom_tile(data=gene.result, aes_string(x="pos.orig", y="alt", fill=col.to.plot[j])) + labs(fill=col.to.plot[j]) +
        scale_fill_gradientn(colors = c("light blue", "white", "pink"), na.value = 'grey') +
        scale_x_continuous(breaks=seq(0, nchar(gene.seq), 50), minor_breaks = seq(0, nchar(gene.seq), 10)) + labs(fill=fill.name[j]) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=all.training.to.plot.plot, aes(x=pos.orig, y=alt, fill=label, width=1, height=1)) +
        scale_fill_gradientn(colors = c("blue", "white", "red"), limits=col.fill.limits) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=secondary.df.to.plot, aes(x=pos.orig, y=alt, fill=ANNO_secondary, width=1, height=1)) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=rsa.df, aes(x=pos.orig, y=alt, fill=ANNO_RSA, width=1, height=1)) +
        scale_fill_gradientn(colors = c("grey", "blue")) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=plddt.df, aes(x=pos.orig, y=alt, fill=ANNO_pLDDT, width=1, height=1)) +
        scale_fill_gradientn(colors = c("orange", "yellow", "lightblue", "blue")) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=unique.df.to.plot, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1, height=1),show.legend = F) +
        ggnewscale::new_scale_fill() +
        geom_tile(data=multiple.df.to.plot, aes(x=pos.orig, y=alt, fill=ANNO_domain_type, width=1, height=1),show.legend = F) +
        theme_bw() + theme(legend.position="bottom") +
        ggtitle(gene.names[o]) + ggeasy::easy_center_title()
    }
    p <- ps[[1]] + ps[[4]] + plot_layout(nrow=2)
    ggsave(paste0(log.dir, gene, '.part.pdf'), p, width = max(25, min(nchar(gene.seq)/70, 49.9)), height = 10)
  } else {
    p <- ggplot() +
      geom_tile(data=gene.result, aes(x=pos.orig, y=alt, fill=logits)) +
      scale_fill_gradientn(colors = c("light blue", "white", "pink"), na.value = 'grey') +
      ggnewscale::new_scale_fill() +
      geom_tile(data=all.training, aes(x=pos.orig, y=alt, fill=score)) +
      scale_fill_gradientn(colors = c("blue", "white", "red")) +
      ggnewscale::new_scale_fill() +
      geom_tile(data=secondary.df, aes(x=pos.orig, y=alt, fill=ANNO_secondary)) +
      theme_bw() + theme(legend.position="bottom") +
      scale_x_continuous(breaks=seq(0, nchar(gene.seq), 100)) +
      ggtitle(gene.names[o]) + ggeasy::easy_center_title()
  }
  p <- patch.plot[[1]] / patch.plot[[2]] / patch.plot[[3]] / patch.plot[[4]] / patch.plot[[5]]
}

system('mv 5genes.all.mut/PreMode/P15056.part.pdf figs/fig.6a.pdf')
system('mv 5genes.all.mut/PreMode/P04637.part.pdf figs/fig.sup.10a.pdf')
system('mv 5genes.all.mut/PreMode/P07949.part.pdf figs/fig.sup.10b.pdf')
system('mv 5genes.all.mut/PreMode/Q14654.part.pdf figs/fig.sup.10c.pdf')