packages feed

BiobaseXNA-0.11.1.1: Biobase/Primary/AA.hs

-- | This module has the translation tables for the genetic code.
--
-- In addition, @Any@ is included to denote that any amino acid is ok, and
-- @Unknown@ to denote unknown data.  We do have a symbol 'Undef' for undefined
-- amino acids, which denotes error condition.
--
-- TODO this nomenclature might change!

module Biobase.Primary.AA where

import           Control.Arrow ((***),first)
import           Data.Aeson
import           Data.Hashable
import           Data.Ix (Ix(..))
import           Data.Map.Strict (Map)
import           Data.Primitive.Types
import           Data.Tuple (swap)
import           Data.Vector.Unboxed.Deriving
import           GHC.Base (remInt,quotInt)
import           GHC.Generics (Generic)
import qualified Data.Bijection.HashMap as B
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BSL
import qualified Data.Foldable as F
import qualified Data.Map.Strict as M
import qualified Data.Text as T
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Generic.Mutable as VGM
import qualified Data.Vector.Unboxed as VU
import qualified GHC.Exts as GHC

import Biobase.Types.BioSequence
import Data.Info

import           Biobase.Primary.Letter



pattern  Stop   = Letter  0 :: Letter AA n
pattern     A   = Letter  1 :: Letter AA n
pattern     B   = Letter  2 :: Letter AA n
pattern     C   = Letter  3 :: Letter AA n
pattern     D   = Letter  4 :: Letter AA n
pattern     E   = Letter  5 :: Letter AA n
pattern     F   = Letter  6 :: Letter AA n
pattern     G   = Letter  7 :: Letter AA n
pattern     H   = Letter  8 :: Letter AA n
pattern     I   = Letter  9 :: Letter AA n
pattern     K   = Letter 10 :: Letter AA n
pattern     L   = Letter 11 :: Letter AA n
pattern     M   = Letter 12 :: Letter AA n
pattern     N   = Letter 13 :: Letter AA n
pattern     P   = Letter 14 :: Letter AA n
pattern     Q   = Letter 15 :: Letter AA n
pattern     R   = Letter 16 :: Letter AA n
pattern     S   = Letter 17 :: Letter AA n
pattern     T   = Letter 18 :: Letter AA n
pattern     V   = Letter 19 :: Letter AA n
pattern     W   = Letter 20 :: Letter AA n
pattern     X   = Letter 21 :: Letter AA n
pattern     Y   = Letter 22 :: Letter AA n
pattern     Z   = Letter 23 :: Letter AA n
pattern Any     = Letter 24 :: Letter AA n     -- TODO @Any == X@ supposedly!
pattern Unknown = Letter 25 :: Letter AA n
pattern Undef   = Letter 26 :: Letter AA n

-- * Creating functions and aa data.

aa :: Int -> Letter AA n
aa = Letter
{-# Inline aa #-}

aaRange = VU.fromList [Stop .. pred Undef]
{-# NoInline aaRange #-}

instance Bounded (Letter AA n) where
    minBound = Stop
    maxBound = Undef

instance LetterChar AA n where
  letterChar = aaChar
  charLetter = charAA

instance ToJSON (Letter AA n) where
  toJSON = toJSON . letterChar

instance FromJSON (Letter AA n) where
  parseJSON = fmap charLetter . parseJSON

instance Info (Letter AA n) where
  info = (:[]) . aaChar

--instance (GHC.IsString f) => ToJSON (Pretty f (Letter AA)) where
--  toJSON = toJSON . T.pack . map letterChar . GHC.toList . getPretty

-- | Translate 'Char' amino acid representation into efficient 'AA' newtype.

charAA :: Char -> Letter AA n
charAA = B.findWithDefaultL Undef charBaa
{-# INLINE charAA #-}

-- | 'Char' representation of an 'AA'.

aaChar :: Letter AA n -> Char
aaChar = B.findWithDefaultR '?' charBaa
{-# INLINE aaChar #-}

-- * lookup tables

charBaa :: B.Bimap (B.HashMap Char (Letter AA n)) (B.HashMap (Letter AA n) Char)
charBaa = B.fromList
  [ ('*',Stop)
  , ('A',A)
  , ('B',B)
  , ('C',C)
  , ('D',D)
  , ('E',E)
  , ('F',F)
  , ('G',G)
  , ('H',H)
  , ('I',I)
  , ('K',K)
  , ('L',L)
  , ('M',M)
  , ('N',N)
  , ('P',P)
  , ('Q',Q)
  , ('R',R)
  , ('S',S)
  , ('T',T)
  , ('V',V)
  , ('W',W)
  , ('X',X)
  , ('Y',Y)
  , ('Z',Z)
  , ('?',Unknown)
  ]
{-# NOINLINE charBaa #-}

-- | List of the twenty "default" amino acids. Used, for example, by HMMer.

twentyAA :: VU.Vector (Letter AA n)
twentyAA = VU.fromList [ A,C,D,E,F,G,H,I,K,L,M,N,P,Q,R,S,T,V,W,Y ]
{-# NoInline twentyAA #-}


-- * instances

instance Show (Letter AA n) where
  show n = [aaChar n]

instance Read (Letter AA n) where
  readsPrec p [] = []
  readsPrec p (x:xs)
    | x==' ' = readsPrec p xs
    | aa <- charAA x = [(aa,xs)]
    | otherwise = []

instance Enum (Letter AA n) where
    succ Undef      = error "succ/Undef:AA"
    succ (Letter x) = Letter $ x+1
    pred Stop       = error "pred/Stop:AA"
    pred (Letter x) = Letter $ x-1
    toEnum k | k>=0 && k<=(getLetter Undef) = Letter k
    toEnum k                               = error $ "toEnum/Letter RNA " ++ show k
    fromEnum (Letter k) = k

instance MkPrimary (VU.Vector Char) AA n where
  primary = VU.map charAA