{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module      :  Analyze.Analyze
-- Description :  Parse sequence file formats and analyze them
-- Copyright   :  (c) Dominik Schrempf 2018
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Fri Oct  5 08:41:05 2018.
module SLynx.Translate.Translate
  ( translateCmd,
  )
where

import Control.Monad.Logger
import Control.Monad.Trans.Reader (ask)
import qualified Data.Text as T
import ELynx.Data.Character.Codon
import ELynx.Data.Sequence.Sequence
import ELynx.Data.Sequence.Translate
import ELynx.Export.Sequence.Fasta
import ELynx.Tools
import SLynx.Tools
import SLynx.Translate.Options

translateSeqs :: Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs :: Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs Int
rf UniversalCode
uc = (Sequence -> Sequence) -> [Sequence] -> [Sequence]
forall a b. (a -> b) -> [a] -> [b]
map (UniversalCode -> Int -> Sequence -> Sequence
translateSeq UniversalCode
uc Int
rf)

-- | Translate sequences.
translateCmd :: ELynx TranslateArguments ()
translateCmd :: ELynx TranslateArguments ()
translateCmd = do
  (TranslateArguments Alphabet
al FilePath
inFile Int
rf UniversalCode
uc) <- Arguments TranslateArguments -> TranslateArguments
forall a. Arguments a -> a
local (Arguments TranslateArguments -> TranslateArguments)
-> ReaderT
     (Arguments TranslateArguments)
     (LoggingT IO)
     (Arguments TranslateArguments)
-> ReaderT
     (Arguments TranslateArguments) (LoggingT IO) TranslateArguments
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT
  (Arguments TranslateArguments)
  (LoggingT IO)
  (Arguments TranslateArguments)
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
  $(Int
FilePath
LogLevel
FilePath -> Text
FilePath -> FilePath -> FilePath -> CharPos -> CharPos -> Loc
Text -> Text
Loc -> Text -> LogLevel -> Text -> ELynx TranslateArguments ()
(Text -> ELynx TranslateArguments ())
-> (Text -> Text) -> Text -> ELynx TranslateArguments ()
forall a. a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
pack :: FilePath -> Text
monadLoggerLog :: forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
id :: forall a. a -> a
. :: forall b c a. (b -> c) -> (a -> b) -> a -> c
logInfo) Text
"Command: Translate sequences to amino acids."
  $(Int
FilePath
LogLevel
FilePath -> Text
FilePath -> FilePath -> FilePath -> CharPos -> CharPos -> Loc
Text -> Text
Loc -> Text -> LogLevel -> Text -> ELynx TranslateArguments ()
(Text -> ELynx TranslateArguments ())
-> (Text -> Text) -> Text -> ELynx TranslateArguments ()
forall a. a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
pack :: FilePath -> Text
monadLoggerLog :: forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
id :: forall a. a -> a
. :: forall b c a. (b -> c) -> (a -> b) -> a -> c
logInfo) (Text -> ELynx TranslateArguments ())
-> Text -> ELynx TranslateArguments ()
forall a b. (a -> b) -> a -> b
$ FilePath -> Text
T.pack (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ FilePath
"  Universal code: " FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> UniversalCode -> FilePath
forall a. Show a => a -> FilePath
show UniversalCode
uc FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> FilePath
"."
  $(Int
FilePath
LogLevel
FilePath -> Text
FilePath -> FilePath -> FilePath -> CharPos -> CharPos -> Loc
Text -> Text
Loc -> Text -> LogLevel -> Text -> ELynx TranslateArguments ()
(Text -> ELynx TranslateArguments ())
-> (Text -> Text) -> Text -> ELynx TranslateArguments ()
forall a. a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
pack :: FilePath -> Text
monadLoggerLog :: forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
id :: forall a. a -> a
. :: forall b c a. (b -> c) -> (a -> b) -> a -> c
logInfo) (Text -> ELynx TranslateArguments ())
-> Text -> ELynx TranslateArguments ()
forall a b. (a -> b) -> a -> b
$ FilePath -> Text
T.pack (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ FilePath
"  Reading frame: " FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> Int -> FilePath
forall a. Show a => a -> FilePath
show Int
rf FilePath -> FilePath -> FilePath
forall a. Semigroup a => a -> a -> a
<> FilePath
"."
  $(Int
FilePath
LogLevel
FilePath -> Text
FilePath -> FilePath -> FilePath -> CharPos -> CharPos -> Loc
Text -> Text
Loc -> Text -> LogLevel -> Text -> ELynx TranslateArguments ()
(Text -> ELynx TranslateArguments ())
-> (Text -> Text) -> Text -> ELynx TranslateArguments ()
forall a. a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
pack :: FilePath -> Text
monadLoggerLog :: forall (m :: * -> *) msg.
(MonadLogger m, ToLogStr msg) =>
Loc -> Text -> LogLevel -> msg -> m ()
id :: forall a. a -> a
. :: forall b c a. (b -> c) -> (a -> b) -> a -> c
logInfo) Text
""
  [Sequence]
ss <- Alphabet
-> FilePath
-> ReaderT (Arguments TranslateArguments) (LoggingT IO) [Sequence]
forall (m :: * -> *).
(MonadIO m, MonadLogger m) =>
Alphabet -> FilePath -> m [Sequence]
readSeqs Alphabet
al FilePath
inFile
  let result :: ByteString
result = [Sequence] -> ByteString
sequencesToFasta ([Sequence] -> ByteString) -> [Sequence] -> ByteString
forall a b. (a -> b) -> a -> b
$ Int -> UniversalCode -> [Sequence] -> [Sequence]
translateSeqs Int
rf UniversalCode
uc [Sequence]
ss
  FilePath -> ByteString -> FilePath -> ELynx TranslateArguments ()
forall a.
Reproducible a =>
FilePath -> ByteString -> FilePath -> ELynx a ()
out FilePath
"translated sequences" ByteString
result FilePath
"fasta"