R/getClassyFire.R

Defines functions getClassyFire

Documented in getClassyFire

#' getClassyFire
#'
#' use classyfire web API to look up full ClassyFire heirarchy for each inchikey
#' @details The $inchikey slot is used to look up the 
#' 
#' @param ramclustObj ramclustR object to ClassyFy
#' @param get.all logical; if TRUE, when inchikey classyfire lookup fails, submits for classyfication.  Can be slow. max.wait (below) sets max time to spend on each compound before moving on. default = FALSE.
#' @param max.wait  numeric; maximum time to wait per compound when 'get.all' = TRUE.  The 
#' @return returns a ramclustR object.  new dataframe in $classyfire slot with rows equal to number of compounds.  
#' @keywords 'ramclustR' 'RAMClustR', 'ramclustR', 'metabolomics', 'classyFire'
#' @author Corey Broeckling
#' @references Djoumbou Feunang Y, Eisner R, Knox C, Chepelev L, Hastings J, Owen G, Fahy E, Steinbeck C, Subramanian S, Bolton E, Greiner R, and Wishart DS. ClassyFire: Automated Chemical Classification With A Comprehensive, Computable Taxonomy. Journal of Cheminformatics, 2016, 8:61. DOI: 10.1186/s13321-016-0174-y

#' @export 


getClassyFire <- function(
  ramclustObj = RC,
  get.all = TRUE,
  max.wait = 10
) {
  
  if(is.null(ramclustObj$inchikey)) {
    stop("no inchikey slot found, please 'annotate' first", '\n')
  }
  
  if(any(names(ramclustObj) == "classyfire")) {redo <- TRUE} else {redo = FALSE}
  
  
  if(!redo) {
    ramclustObj$classyfire <- data.frame(
      "inchikey" = rep(NA, length(ramclustObj$inchikey)),
      "kingdom" = rep(NA, length(ramclustObj$inchikey)),
      "superclass" = rep(NA, length(ramclustObj$inchikey)),
      "class" = rep(NA, length(ramclustObj$inchikey)),
      "subclass" = rep(NA, length(ramclustObj$inchikey)),
      "parent" = rep(NA, length(ramclustObj$inchikey)),
      "description" = rep(NA, length(ramclustObj$inchikey))
    )
  }
  
  
  url = 'http://classyfire.wishartlab.com'
  
  for(i in 1:length(ramclustObj$inchikey)) {
    if(is.na(ramclustObj$inchikey[i])) {next} 
    out<- tryCatch(fromJSON(paste0(url, "/entities/", ramclustObj$inchikey[i], ".json")), 
                   error = function(x) {return(NA)})
    if(length(out) > 1) {
      a <- ramclustObj$inchikey[i]
      b <- out$kingdom$name; if(is.null(b)) b<-NA
      c <- out$superclass$name; if(is.null(c)) c<-NA
      d <- out$class$name; if(is.null(d)) d<-NA
      e <- out$subclass$name; if(is.null(e)) e<-NA
      f <- out$direct_parent$name; if(is.null(f)) f<-NA
      g <- out$description; if(is.null(g)) g<-NA
      
      ramclustObj$classyfire[i,]<- c(a,b,c,d,e,f,g)
      rm(out)
    }
  }
  
  if(get.all) {
    get.full<-which(!is.na(ramclustObj$inchikey) & is.na(ramclustObj$classyfire[,2]))
    for ( i in get.full) { 
      cat(i, '\n')
      if(!is.na(ramclustObj$smiles[i])) {
        params <- list(label = "ramclustR",
                       query_input = ramclustObj$smiles[i],
                       query_type = "STRUCTURE")
        
        submit <- httr::POST(
          "http://classyfire.wishartlab.com/queries",
          body = params,
          encode = "json",
          httr::accept_json(),
          httr::add_headers("Content-Type" = "application/json")
        )
        
        query_id <- jsonlite::fromJSON(httr::content(submit, 'text')) # %>% unlist() %>% as.list()
        
        out<-list()
        out$classification_status <- "not done"
        Sys.sleep(1)
        skiptonext <- FALSE
        time.a<-Sys.time()
        while (out$classification_status != "Done") {
          Sys.sleep(1)
          out <- fromJSON(paste0("http://classyfire.wishartlab.com/queries/", 
                                 query = query_id$id, ".json"))
          if (round(as.numeric(difftime(Sys.time(), time.a, units = "secs")), 3) >= max.wait) {
            cat("timed out", '\n')
            skiptonext <- TRUE
            break
          }
        }
        
        
        if( (out$classification_status != "Done")) {
          ramclustObj$classyfire[i,] <- c(ramclustObj$inchikey[i], rep(NA, 6))
          } else {
          newinchikey<-out$entities$inchikey
          newinchikey<-gsub("InChIKey=", "", newinchikey)
          out<-fromJSON(paste0(url, "/entities/", newinchikey, ".json"))
          
          a <- ramclustObj$inchikey[i]
          b <- out$kingdom$name; if(is.null(b)) b<-NA
          c <- out$superclass$name; if(is.null(c)) c<-NA
          d <- out$class$name; if(is.null(d)) d<-NA
          e <- out$subclass$name; if(is.null(e)) e<-NA
          f <- out$direct_parent$name; if(is.null(f)) f<-NA
          g <- out$description; if(is.null(g)) g<-NA
          
          ramclustObj$classyfire[i,]<- c(a,b,c,d,e,f,g)
          rm(out)
        }  
      }
    }
  }
  return(ramclustObj)
}
sneumann/RAMClustR documentation built on May 30, 2019, 5:05 a.m.