module Bio.RNAcentralHTTP (rnaCentralHTTP,
buildSequenceViaMD5Query,
getRNACentralEntries,
showRNAcentralAlienEvaluation,
RNAcentralEntryResponse,
RNAcentralEntry
) where
import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy.Char8 as L8
import Network
import Control.Concurrent
import Data.Text
import Data.Aeson
import GHC.Generics
import qualified Data.Digest.Pure.MD5 as M
import Bio.Core.Sequence
import Bio.Sequence.Fasta
import Data.Either
import Data.Aeson.Types
--Datatypes
data RNAcentralEntryResponse = RNAcentralEntryResponse
{
_count :: Int,
_next :: Maybe Text,
_previous :: Maybe Text,
results :: [RNAcentralEntry]
}
deriving (Show, Eq, Generic)
instance ToJSON RNAcentralEntryResponse where
toJSON = genericToJSON defaultOptions
instance FromJSON RNAcentralEntryResponse
data RNAcentralEntry = RNAcentralEntry
{
_url :: Text,
rnacentral_id :: Text,
md5 :: Text,
_sequence :: Text,
length :: Int,
_xrefs :: Text,
_publications :: Text
}
deriving (Show, Eq, Generic)
instance ToJSON RNAcentralEntry where
toJSON = genericToJSON defaultOptions
instance FromJSON RNAcentralEntry
startSession :: String -> IO (Either String RNAcentralEntryResponse)
startSession query' = do
requestXml <- withSocketsDo
$ sendQuery query'
let eitherErrorResponse = eitherDecode requestXml :: Either String RNAcentralEntryResponse
return eitherErrorResponse
sendQuery :: String -> IO L8.ByteString
sendQuery query' = simpleHttp ("http://rnacentral.org/api/v1/rna/" ++ query')
rnaCentralHTTP :: String -> IO (Either String RNAcentralEntryResponse)
rnaCentralHTTP query' = do
startSession query'
delayedRNACentralHTTP :: String -> IO (Either String RNAcentralEntryResponse)
delayedRNACentralHTTP query' = do
threadDelay 55000
startSession query'
getRNACentralEntries :: [String] -> IO [(Either String RNAcentralEntryResponse)]
getRNACentralEntries queries = do
responses <- mapM delayedRNACentralHTTP queries
return responses
buildSequenceViaMD5Query :: Sequence -> String
buildSequenceViaMD5Query s = qString
where querySequence = unSD (seqdata s)
querySequenceUreplacedwithT = L8.map bsreplaceUT querySequence
md5Sequence = M.md5 querySequenceUreplacedwithT
qString = "?md5=" ++ (show md5Sequence)
showRNAcentralAlienEvaluation :: [(Either String RNAcentralEntryResponse)] -> String
showRNAcentralAlienEvaluation responses = output
where resultEntries = Prelude.concatMap results (rights responses)
resulthead = "rnacentral_id\tmd5\tlength\n"
resultentries = Prelude.concatMap showRNAcentralAlienEvaluationLine resultEntries
output = if resultentries == [] then resulthead ++ "No matching sequences found in RNAcentral\n" else resulthead ++ resultentries
showRNAcentralAlienEvaluationLine :: RNAcentralEntry -> String
showRNAcentralAlienEvaluationLine entry = unpack (rnacentral_id entry) ++ "\t" ++ unpack (md5 entry) ++ "\t" ++ show (Bio.RNAcentralHTTP.length entry) ++"\n"
bsreplaceUT :: Char -> Char
bsreplaceUT a
| a == 'U' = 'T'
| otherwise = a