## ----echo=FALSE---------------------------------------------------------------
library(BiocStyle)
self <- Githubpkg("gesel-inc/gesel-R", "gesel")
knitr::opts_chunk$set(error=FALSE, warning=FALSE, message=FALSE)

## -----------------------------------------------------------------------------
my.genes <- c("SNAP25", "NEUROD6", "GAD1", "GAD2", "RELN")

## -----------------------------------------------------------------------------
library(gesel)
res <- querySets("9606", genes = my.genes)
head(res)

## -----------------------------------------------------------------------------
res <- querySets("9606", text = "brain")
head(res)

# Or, filtering by both genes and text. 
res <- querySets("9606", genes = my.genes, text = "neur*")
head(res)

## -----------------------------------------------------------------------------
everything <- loadAllSets("9606", type = "symbol", as.compressed = TRUE)
everything
S4Vectors::mcols(everything)

## -----------------------------------------------------------------------------
library(gesel)
gene.idx <- searchGenes("9606", my.genes)
gene.idx # this is a list of integer vectors, in case of 1:many mappings.
gene.idx <- unlist(gene.idx)
fetchAllGenes("9606")[gene.idx,] # double-checking that we got it right.

## -----------------------------------------------------------------------------
overlaps <- searchOverlappingSets("9606", gene.idx, counts.only=FALSE)
head(overlaps$overlap) # set index and the identities of overlapping genes.

## -----------------------------------------------------------------------------
first.set.info <- fetchSomeSets("9606", head(overlaps$overlap$set)) # getting details of the first few sets
first.set.info
first.col.info <- fetchSomeCollections("9606", first.set.info$collection) # getting details of the collections
first.col.info

## -----------------------------------------------------------------------------
chits <- searchSetText("9606", "cancer")
fetchSomeSets("9606", head(chits))
ihits <- searchSetText("9606", "innate immun*")
fetchSomeSets("9606", head(ihits))
thits <- searchSetText("9606", "cd? t cell")
fetchSomeSets("9606", head(thits))

## -----------------------------------------------------------------------------
cancer.sets <- intersect(chits, overlaps$overlap$set)
info <- fetchSomeSets("9606", cancer.sets)
m <- match(cancer.sets, overlaps$overlap$set)
info$count <- overlaps$overlap$count[m]
info$pvalue <- overlaps$overlap$pvalue[m]
info[head(order(info$pvalue)),]

## -----------------------------------------------------------------------------
set.info <- fetchAllSets("9606")
nrow(set.info)
head(set.info)

## -----------------------------------------------------------------------------
head(set.info[cancer.sets,])
head(fetchSomeSets("9606", cancer.sets)) # same results

## -----------------------------------------------------------------------------
flushMemoryCache()

## -----------------------------------------------------------------------------
mock.collection.info <- data.frame(
    title=c("FOO", "BAR"),
    description=c("I am a foo", "I am a bar"),
    maintainer=c("Aaron", "Aaron"),
    source=c("https://foo", "https://bar")
)

mock.set.info <- list(
    data.frame(
        name=sprintf("FOO_%i", seq_len(20)),
        description=sprintf("this is FOO %i", seq_len(20))
    ),
    data.frame(
        name=sprintf("BAR_%i", seq_len(50)),
        description=sprintf("this is BAR %i", seq_len(50))
    )
)

mock.num.genes <- 10000
mock.set.membership <- list(
    lapply(seq_len(nrow(mock.set.info[[1]])), function(i) {
        sample(mock.num.genes, sample(500, 1))
    }),
    lapply(seq_len(nrow(mock.set.info[[2]])), function(i) {
        sample(mock.num.genes, sample(200, 1))
    })
)

## -----------------------------------------------------------------------------
mock.db.dir <- tempfile()
dir.create(mock.db.dir)
prepareDatabaseFiles(
    "12345", # mock NCBI taxonomy ID
    mock.collection.info, 
    mock.set.info, 
    mock.set.membership,
    mock.num.genes,
    path = mock.db.dir
)
list.files(mock.db.dir)

## -----------------------------------------------------------------------------
mock.ref.genes <- list()
for (type in c("ensembl", "entrez", "symbol")) {
    gene.ids <- sprintf("%s_%05d", type, seq_len(19999))

    # Generating a 1:many mapping of genes to names to make things interesting.
    genes.plus <- mock.num.genes * 1.1 
    chosen <- sample(gene.ids, genes.plus, replace=TRUE)
    ids <- sample(mock.num.genes, genes.plus, replace=TRUE)
    mock.ids <- split(chosen, factor(ids, seq_len(mock.num.genes)))

    # Cleaning things up before saving to file.
    mock.ids <- lapply(mock.ids, unique)
    mock.ref.genes[[type]] <- unname(mock.ids)
}

mock.gene.dir <- tempfile()
dir.create(mock.gene.dir)
prepareGeneFiles(
    "12345",
    mock.ref.genes,
    path = mock.gene.dir
)
list.files(mock.gene.dir)

## -----------------------------------------------------------------------------
custom.config <- newConfig(
    fetch.file=function(x) file.path(mock.db.dir, x),
    fetch.gene=function(x) file.path(mock.gene.dir, x),
    fetch.ranges=function(n, s, e) readDatabaseRanges(mock.db.dir, n, s, e) 
)

## -----------------------------------------------------------------------------
# Trying a low-level function:
head(fetchAllSets("12345", config = custom.config))

# Trying one of the more user-friendly functions:
head(querySets(
    "12345",
    genes = sprintf("ensembl_%05d", 1:100),
    text = "FOO",
    config = custom.config
))

## -----------------------------------------------------------------------------
sessionInfo()

