## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  warning = FALSE,
  message = FALSE
)

## ----setup--------------------------------------------------------------------
library(dbparser)
library(dplyr)

## ----parse--------------------------------------------------------------------
parse_record <- function(file_name) {
  parseDrugBank(
    db_path            = system.file("extdata", file_name, package = "dbparser"),
    drug_options       = NULL,
    parse_salts        = FALSE,
    parse_products     = FALSE,
    references_options = NULL,
    cett_options       = c("targets", "enzymes")
  )
}

lepirudin   <- parse_record("drugbank_record_biotech.xml")
bivalirudin <- parse_record("drugbank_record_small_molecule.xml")
dbs         <- list(lepirudin, bivalirudin)

# Stack the same table from every parsed record
stack_table <- function(getter) {
  bind_rows(lapply(dbs, function(db) getter(db)))
}

drugs <- stack_table(function(db) db$drugs$general_information) %>%
  select(drugbank_id, drug_name = name, type)
drugs

## ----target_actions-----------------------------------------------------------
target_actions <- stack_table(function(db) db$cett$targets$actions)
target_actions

## ----pitfall------------------------------------------------------------------
targets <- stack_table(function(db) db$cett$targets$general_information)

targets %>%
  select(drugbank_id, target_id, target_name = name) %>%
  inner_join(select(target_actions, -drugbank_id), by = "target_id")

## ----correct_join-------------------------------------------------------------
drug_target_actions <- targets %>%
  select(drugbank_id, target_id, target_name = name, known_action) %>%
  inner_join(target_actions, by = c("drugbank_id", "target_id")) %>%
  inner_join(drugs, by = "drugbank_id")

drug_target_actions

## ----genes--------------------------------------------------------------------
target_genes <- stack_table(
  function(db) db$cett$targets$polypeptides$general_information) %>%
  select(drugbank_id, target_id, uniprot_id = polypeptide_id, gene_name,
         cellular_location)

drug_target_genes <- drug_target_actions %>%
  inner_join(target_genes, by = c("drugbank_id", "target_id")) %>%
  select(drug_name, target_name, gene_name, uniprot_id, action, known_action,
         cellular_location)

drug_target_genes

## ----shared_mechanism---------------------------------------------------------
lepirudin_mechanism <- drug_target_genes %>%
  filter(drug_name == "Lepirudin") %>%
  distinct(gene_name, action)

drug_target_genes %>%
  semi_join(lepirudin_mechanism, by = c("gene_name", "action")) %>%
  filter(drug_name != "Lepirudin") %>%
  select(drug_name, gene_name, action, known_action)

## ----profile------------------------------------------------------------------
cett_profile <- function(cett_type) {
  id_col <- paste0(sub("s$", "", cett_type), "_id")

  info <- stack_table(function(db) db$cett[[cett_type]]$general_information)
  acts <- stack_table(function(db) db$cett[[cett_type]]$actions)
  if (NROW(info) == 0 || NROW(acts) == 0) {
    return(NULL)
  }

  info %>%
    select(drugbank_id, cett_id = all_of(id_col), protein = name,
           known_action) %>%
    inner_join(rename(acts, cett_id = all_of(id_col)),
               by = c("drugbank_id", "cett_id")) %>%
    mutate(cett_type = cett_type)
}

profile <- bind_rows(cett_profile("targets"), cett_profile("enzymes")) %>%
  inner_join(drugs, by = "drugbank_id") %>%
  select(drug_name, cett_type, protein, action, known_action)

profile

