{- RGeneConvert
Gregory W. Schwartz
Collections the functions pertaining to converting certain annotations into
other annotations using biomart from R
(http://bioconductor.org/packages/release/bioc/html/biomaRt.html).
-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module RGeneConvert
( getRMart
, toRGeneAnn
, toRGeneAnnMultiple
) where
-- Standard
import qualified Data.Map.Strict as Map
-- Cabal
import qualified Data.Text as T
import qualified Foreign.R as R
import Foreign.R (SEXP, SEXPTYPE)
import Language.R.Instance as R
import Language.R.QQ
import Language.R.Literal as R
-- Local
import Types
-- | Get the R mapping of gene to gene.
getRMart :: String -> R s (RMart s)
getRMart species = fmap RMart
$ [r| library(biomaRt)
mart = useMart("ensembl", dataset=species_hs)
|]
-- | Get the R mapping of gene to gene.
toRGeneAnn :: RMart s -> RType -> UnknownAnn -> IO (Maybe Ann)
toRGeneAnn _ _ (UnknownAnn "") = return Nothing
toRGeneAnn rMart (RType (_, !from, !to)) (UnknownAnn textQuery) =
(fmap . fmap) Ann $ R.runRegion $ do
let query = T.unpack textQuery
mart = unRMart rMart
res <- [r| map = getBM( attributes = c(from_hs, to_hs)
, filters = from_hs
, values = c(query_hs)
, mart = mart_hs
, uniqueRows=FALSE
)
as.character(map[1,2])
|]
let naCheck "NA" = Nothing
naCheck x = Just x
return . fmap T.pack . naCheck $ (R.fromSomeSEXP res :: String)
-- | Get the R mapping of a list of genes to genes.
toRGeneAnnMultiple :: RMart s -> RType -> [UnknownAnn] -> IO [Maybe Ann]
toRGeneAnnMultiple rMart (RType (_, !from, !to)) textQueries = R.runRegion $ do
let queries = fmap (T.unpack . unUnknownAnn) textQueries
mart = unRMart rMart
res <- [r| getBM( attributes = c(from_hs, to_hs)
, filters = from_hs
, values = queries_hs
, mart = mart_hs
, uniqueRows = TRUE
)
|]
origR <- [r| as.character(res_hs[,1]) |]
destR <- [r| as.character(res_hs[,2]) |]
let orig = R.fromSomeSEXP origR :: [String]
dest = R.fromSomeSEXP destR :: [String]
let annMap = Map.fromList . zip orig $ dest
return . fmap (fmap (Ann . T.pack) . flip Map.lookup annMap) $ queries