## ----setup, include=FALSE-----------------------------------------------------
library(GeneNetworkBuilder)
library(knitr)
library(STRINGdb)
library(org.Hs.eg.db)

## ----STRING-------------------------------------------------------------------
library(GeneNetworkBuilder)
gR <- NULL
try({ ## just in case STRINGdb not work
    library(STRINGdb)
    curr_version_table <- 
      read.table(url("https://string-db.org/api/tsv-no-header/version"),
                 colClasses = "character")$V1[1]
    string_db <- STRINGdb$new( version=curr_version_table, species=9606,
                           score_threshold=400)
    data(diff_exp_example1)
    example1_mapped <- string_db$map( diff_exp_example1, "gene", removeUnmappedRows = TRUE )
    i <- string_db$get_interactions(example1_mapped$STRING_id)
    colnames(example1_mapped) <- c("gene", "P.Value", "logFC", "symbols")
    ## get significant up regulated genes.
    genes <- unique(example1_mapped$symbols[example1_mapped$P.Value<0.005 & example1_mapped$logFC>3])
    ### rooted network, guess the root by connections
    x<-networkFromGenes(genes = genes, interactionmap=i, level=3)
    ## filter network
    ## unique expression data by symbols column
    expressionData <- uniqueExprsData(example1_mapped, 
                                       method = 'Max', 
                                       condenseName = "logFC")
    ## merge binding table with expression data by symbols column
    cifNetwork<-filterNetwork(rootgene=x$rootgene, 
                              sifNetwork=x$sifNetwork, 
                              exprsData=expressionData, mergeBy="symbols",
                              miRNAlist=character(0), 
                              tolerance=1, cutoffPVal=0.001, cutoffLFC=1)
    ## convert the id back to symbol
    IDsMap <- expressionData$gene
    names(IDsMap) <- expressionData$symbols
    cifNetwork <- convertID(cifNetwork, IDsMap)
    ## add additional info for searching, any character content columns
    cifNetwork$info1 <- sample(c("groupA", "groupB"),
                               size = nrow(cifNetwork),
                               replace = TRUE)
    cifNetwork$info2 <- sample(c(FALSE, TRUE),
                               size = nrow(cifNetwork),
                               replace = TRUE)
    cifNetwork$info3 <- sample(seq.int(7),
                               size = nrow(cifNetwork),
                               replace = TRUE)
    ## polish network
    gR<-polishNetwork(cifNetwork)
    ## browse network
    browseNetwork(gR)
    
    ## try predefined colors
    cifNetwork$color <- sample(rainbow(7), nrow(cifNetwork), replace = TRUE)
    ## polish network
    gR<-polishNetwork(cifNetwork, nodecolor="color")
    ## browse network
    browseNetwork(gR)
    
    ### unrooted network
    x<-networkFromGenes(genes = genes, interactionmap=i, unrooted=TRUE)
    ## filter network
    ## unique expression data by symbols column
    expressionData <- uniqueExprsData(example1_mapped, 
                                       method = 'Max', 
                                       condenseName = "logFC")
    ## merge binding table with expression data by symbols column
    cifNetwork<-filterNetwork(sifNetwork=x$sifNetwork, 
                              exprsData=expressionData, mergeBy="symbols",
                              miRNAlist=character(0), 
                              tolerance=1, cutoffPVal=0.001,
                              cutoffLFC=1) # set minify=FALSE to retrieve all the interactions
    ## convert the id to symbol
    IDsMap <- expressionData$gene
    names(IDsMap) <- expressionData$symbols
    cifNetwork <- convertID(cifNetwork, IDsMap)
    ## polish network
    gR<-polishNetwork(cifNetwork)
    ## browse network
    browseNetwork(gR)
})

## ---- subset------------------------------------------------------------------
if(!is.null(gR)){
  library(org.Hs.eg.db)
  goGenes <- mget("GO:0002274", org.Hs.egGO2ALLEGS)[[1]]
  goGenes <- unique(unlist(mget(unique(goGenes), org.Hs.egSYMBOL)))
  gRs <- subsetNetwork(gR, goGenes)
  browseNetwork(gRs)
}

