packages feed

BiobaseENA (empty) → 0.0.0.1

raw patch · 12 files changed

+564/−0 lines, 12 filesdep +BiobaseENAdep +BiobaseTypesdep +QuickChecksetup-changed

Dependencies added: BiobaseENA, BiobaseTypes, QuickCheck, base, bytestring, containers, directory, file-embed, lens, megaparsec, mtl, tasty, tasty-quickcheck, tasty-th, text, vector, vector-th-unbox

Files

+ Biobase/GeneticCodes.hs view
@@ -0,0 +1,70 @@++module Biobase.GeneticCodes+  ( module Biobase.GeneticCodes+  , module Biobase.GeneticCodes.Types+  , fromByteString+  , fromFile+  , geneticCodes+  , translate+  ) where++import Control.Lens+import Control.Monad.Except+import Data.List (find)+import Data.Text (pack)+import Data.Text (Text,isInfixOf,unpack)+import System.Directory (doesFileExist)+import Text.Printf+import System.Exit (exitSuccess)++import Biobase.GeneticCodes.Embedded+import Biobase.GeneticCodes.Import+import Biobase.GeneticCodes.Translation+import Biobase.GeneticCodes.Types++++codeByTableID+  ∷ (MonadError String m)+  ⇒ [TranslationTable c a]+  → Int+  → m (TranslationTable c a)+codeByTableID ts i+  = maybe (throwError $ printf "No TranslationTable with ID %d found!" i) return+  $ find (\t → t^.tableID == i) ts++codeByTableNameInfix+  ∷ (MonadError String m)+  ⇒ [TranslationTable c a]+  → Text+  → m (TranslationTable c a)+codeByTableNameInfix ts n+  = maybe (throwError $ printf "No TranslationTable with Name infix %s found!" $ unpack n) return+  $ find (\t → n `isInfixOf` (t^.tableName)) ts++-- | If the given filepath exists, then we try to load the genetic table from+-- the file. This will fail if there is not exactly one genetic table there. If+-- @fp@ is not a file, we try parsing @fp@ as a numeric ID and look for that+-- table. Finally we try finding an infix with that name.+--+-- This is all slightly "unsafe" but captures the most common scenario where we+-- either load such a table from file or need selection of the correct one.+--+-- If the given filepath is @"list"@, then a list of table id's and table names+-- is returned.++fromFileOrCached+  ∷ (MonadIO m, MonadError String m)+  ⇒ FilePath+  → m (TranslationTable Char Char)+fromFileOrCached fp = do+  dfe ← liftIO $ doesFileExist fp+  if | fp == "list" → do+          mapM_ (liftIO . uncurry (printf "%3d %s\n")) [ (t^.tableID,t^.tableName) | t ← geneticCodes ]+          liftIO exitSuccess+     | dfe → fromFile fp >>= \case+         [x] → return x+         xs  → throwError $ fp ++ " should contain exactly one translation table!"+     | [(k,"")] ← reads fp → codeByTableID geneticCodes k+     | otherwise → codeByTableNameInfix geneticCodes $ pack fp+
+ Biobase/GeneticCodes/Embedded.hs view
@@ -0,0 +1,16 @@++module Biobase.GeneticCodes.Embedded where++import Control.Monad.Except+import Data.ByteString (ByteString)+import Data.FileEmbed++import Biobase.GeneticCodes.Import+import Biobase.GeneticCodes.Types++geneticCodesFile ∷ ByteString+geneticCodesFile = $(embedFile "sources/translation-tables")++geneticCodes ∷ [TranslationTable Char Char]+geneticCodes = either error id . runExcept $ fromByteString geneticCodesFile+
+ Biobase/GeneticCodes/Import.hs view
@@ -0,0 +1,78 @@++-- |+--+-- The tables imported with these functions are from ENA:+-- <https://www.ebi.ac.uk/ena/browse/translation-tables>++module Biobase.GeneticCodes.Import where++import Control.Monad.Except+import Data.ByteString.Char8 as BS hiding (unpack,map)+import Data.ByteString.Char8 (ByteString)+import Data.Text.Encoding (decodeUtf8)+import Data.Text.IO as TIO+import Data.Text (Text,unpack)+import Data.Void+import System.Exit+import Text.Megaparsec+import Text.Megaparsec.Char as MC+import Text.Megaparsec.Char.Lexer as MCL++import Biobase.Types.Codon++import Biobase.GeneticCodes.Types++++type TTParser = Parsec Void Text++-- | Import translation tables from a given file. In case of parse error, print+-- the error and exit with a failure.++fromFile+  ∷ (MonadIO m, MonadError String m)+  ⇒ FilePath+  → m [TranslationTable Char Char]+fromFile fp = (liftIO $ BS.readFile fp) >>= fromByteString++-- | Parse a ByteString with translation tables.++fromByteString+  ∷ (MonadError String m)+  ⇒ ByteString+  → m [TranslationTable Char Char]+fromByteString bs = case runParser (some parseTranslationTable) "" (decodeUtf8 bs) of+    -- Left err → throwError $ parseErrorPretty err -- megaparsec 6.x+    Left err → throwError $ errorBundlePretty err   -- megaparsec 7.x+    Right rs → return rs++-- | Parses a single translation table.++parseTranslationTable ∷ TTParser (TranslationTable Char Char)+parseTranslationTable = do+  (i,hdr) ← parseHeader+  aas     ← parseData "amino acids"+  starts' ← parseData "start codons"+  base1   ← parseData "Base 1"+  base2   ← parseData "Base 2"+  base3   ← parseData "Base 3"+  let triplets = zipWith3 Codon base1 base2 base3+  let starts   = map (=='M') starts'+  let translations = zipWith3 TranslationElement triplets starts aas+  return $ genTranslationTable i hdr translations++-- | Parse the header, returning the Identifier and the name of the table.++parseHeader ∷ TTParser (Int,Text)+parseHeader+  = (,) <$> (fromIntegral <$> lexeme MC.space decimal)+  <* char ':' <* MC.space+  <*> takeWhileP Nothing (/= '\n')+  <* MC.space++parseData ∷ Text → TTParser String+parseData t+  = string' t <* MC.space+  *> (unpack <$> takeP Nothing 64)+  <* MC.space+
+ Biobase/GeneticCodes/Translation.hs view
@@ -0,0 +1,70 @@++-- | Abstract translation functionality. Given a genetic code translation table+-- (as provided within this module), provide translation from the nucleotide to+-- the amino acid alphabet.+--+-- Limited "backtranslation" capabilities are provided. Since this process is+-- lossy, it should only be used in very specific circumstances.+--+-- TODO Translation from @BioSequence RNA is missing.++module Biobase.GeneticCodes.Translation where++import           Control.Lens+import qualified Data.Map.Strict as M+import qualified Data.ByteString.Char8 as BS++import           Biobase.Types.BioSequence+import           Biobase.Types.Codon++import           Biobase.GeneticCodes.Types++++-- |++class Translation t where+  -- | Defines the target type for a given translation input.+  type TargetType t ∷ *+  -- | Type of the nucleotide characters.+  type CodonType t ∷ *+  -- | Type of the amino acid characters.+  type AAType t ∷ *+  -- | Translate from a given type of sequence @t@ into the target type.+  translate ∷ TranslationTable (CodonType t) (AAType t) → t → TargetType t++-- | Very simple translation of individual base triplets.++instance Translation (Codon Char) where+  type TargetType  (Codon Char) = Char+  type CodonType (Codon Char) = Char+  type AAType      (Codon Char) = Char+  translate tbl t = maybe 'X' _aminoAcid $ M.lookup t (tbl^.codonToAminoAcid)+  {-# Inline translate #-}++-- | Strings of characters are normally very inconvenient but useful in+-- backtracking cases. Fully assumes that the alphabet is DNA. Ignores+-- non-triplets at the end.++instance Translation String where+  type TargetType String = String+  type CodonType String = Char+  type AAType String = Char+  translate tbl =+    let go xs | [x,y,z] ← hd = translate tbl (Codon x y z) : go tl+              | otherwise = []+              where (hd,tl) = splitAt 3 xs+    in  go++-- | Translation of @BioSequence DNA@. The translation tables assume DNA+-- triplets anyway. Biologically there should be a transcription step in+-- between. Ignores non-triplets at the end.++instance Translation (BioSequence DNA) where+  type TargetType (BioSequence DNA) = BioSequence AA+  type CodonType (BioSequence DNA) = Char+  type AAType (BioSequence DNA) = Char+  translate tbl (BioSequence xs) =+    let go k = Just (translate tbl $ Codon (BS.index xs k) (BS.index xs (k+1)) (BS.index xs (k+2)) ,k+3)+    in  BioSequence . fst $ BS.unfoldrN (BS.length xs `div` 3) go 0+
+ Biobase/GeneticCodes/Types.hs view
@@ -0,0 +1,49 @@++-- |++module Biobase.GeneticCodes.Types where++import Control.Lens+import Data.ByteString.Char8 (ByteString)+import Data.Map.Strict (Map,fromList,fromListWith)+import Data.Text (Text)++import Biobase.Types.Codon++++data TranslationElement c a = TranslationElement+  { _baseCodon    ∷ !(Codon c)+  , _isStartCodon ∷ !Bool+  , _aminoAcid    ∷ !a+  }+  deriving (Show)+makeLenses ''TranslationElement++data TranslationTable c a = TranslationTable+  { _codonToAminoAcid  ∷ !(Map (Codon c) (TranslationElement c a))+  , _aminoAcidtoCodons ∷ !(Map a [TranslationElement c a])+  , _tableID           ∷ !Int+  , _tableName         ∷ !Text+  }+  deriving (Show)+makeLenses ''TranslationTable++genTranslationTable+  ∷ (Ord c, Ord a)+  ⇒ Int+  -- ^ table identifier+  → Text+  -- ^ table hdr / table name+  → [TranslationElement c a]+  -- ^ known translation elements (should be @4^3@ but is not checked)+  → TranslationTable c a+  -- ^ finished translation table+{-# Inlinable genTranslationTable #-}+genTranslationTable i hdr xs = TranslationTable+  { _codonToAminoAcid  = fromList [ (t^.baseCodon, t) | t ← xs ]+  , _aminoAcidtoCodons = fromListWith (++) [ (t^.aminoAcid, [t]) | t ← xs ]+  , _tableID           = i+  , _tableName         = hdr+  }+
+ BiobaseENA.cabal view
@@ -0,0 +1,94 @@+Cabal-version:  2.2+Name:           BiobaseENA+Version:        0.0.0.1+License:        BSD-3-Clause+License-file:   LICENSE+Author:         Christian Hoener zu Siederdissen+Maintainer:     choener@bioinf.uni-leipzig.de+Copyright:      Christian Hoener zu Siederdissen, 2019+homepage:       https://github.com/choener/BiobaseENA+bug-reports:    https://github.com/choener/BiobaseENA/issues+Stability:      Experimental+Category:       Data+Build-type:     Simple+tested-with:    GHC == 8.4.4+Synopsis:       European Nucleotide Archive data+Description:+                Provides data (and later API) access to the European Nucleotide Archive.+                .+                * Taxonomy Service / Translation tables (hardcoded)++++extra-source-files:+  changelog.md+  README.md+  sources/translation-tables+++common deps+  build-depends: base                     >= 4.7      &&  < 5.0+               , bytestring+               , containers+               , directory+               , file-embed               >= 0.0.10+               , lens                     >= 4.0+               , megaparsec               >= 7.0+               , mtl                      >= 2.0+               , text+               , vector                   >= 0.10+               , vector-th-unbox          >= 0.2+               --+               , BiobaseTypes             == 0.2.0.*+  ghc-options:+    -O2+    -funbox-strict-fields+  default-language:+    Haskell2010+  default-extensions: BangPatterns+                    , FlexibleContexts+                    , FlexibleInstances+                    , MultiWayIf+                    , LambdaCase+                    , OverloadedStrings+                    , TemplateHaskell+                    , TypeFamilies+                    , UnicodeSyntax+++library+  import:+    deps+  exposed-modules:+    Biobase.GeneticCodes+    Biobase.GeneticCodes.Embedded+    Biobase.GeneticCodes.Import+    Biobase.GeneticCodes.Translation+    Biobase.GeneticCodes.Types+++++test-suite properties+  import:+    deps+  type:+    exitcode-stdio-1.0+  main-is:+    properties.hs+  ghc-options:+    -threaded -rtsopts -with-rtsopts=-N+  hs-source-dirs:+    tests+  build-depends: BiobaseENA+               , QuickCheck                   >= 2.7+               , tasty                        >= 0.11+               , tasty-quickcheck             >= 0.8+               , tasty-th                     >= 0.1++++source-repository head+  type: git+  location: git://github.com/choener/BiobaseENA+
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Christian Hoener zu Siederdissen 2018++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Christian Hoener zu Siederdissen nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,16 @@+[![Build Status](https://travis-ci.org/choener/BiobaseENA.svg?branch=master)](https://travis-ci.org/choener/BiobaseENA)++# BiobaseENA++Data from the European Nucleotide Archive. Currently only provides translation+table but is supposed to, at some point, provide API access to their data.++++#### Contact++Christian Hoener zu Siederdissen  +Leipzig University, Leipzig, Germany  +choener@bioinf.uni-leipzig.de  +http://www.bioinf.uni-leipzig.de/~choener/  +
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ changelog.md view
@@ -0,0 +1,6 @@+0.0.0.1+-------++- initial creation+- using megaparsec (testing for now)+
+ sources/translation-tables view
@@ -0,0 +1,125 @@+1: Standard+Amino acids  FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons ---M---------------M---------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++2: Vertebrate Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSS**VVVVAAAADDEEGGGG+Start codons --------------------------------MMMM---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++3: Yeast Mitochondrial+Amino acids  FFLLSSSSYY**CCWWTTTTPPPPHHQQRRRRIIMMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons ----------------------------------MM----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++4: Mold Mitochondrial; Protozoan Mitochondrial; Coelenterate Mitochondrial; Mycoplasma; Spiroplasma+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons --MM---------------M------------MMMM---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++5: Invertebrate Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSSSSVVVVAAAADDEEGGGG+Start codons ---M----------------------------MMMM---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++6: Ciliate Nuclear; Dasycladacean Nuclear; Hexamita Nuclear+Amino acids  FFLLSSSSYYQQCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons -----------------------------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++9: Echinoderm Mitochondrial; Flatworm Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNNKSSSSVVVVAAAADDEEGGGG+Start codons -----------------------------------M---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++10: Euplotid Nuclear+Amino acids  FFLLSSSSYY**CCCWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons -----------------------------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++11: Bacterial, Archaeal and Plant Plastid+Amino acids  FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons ---M---------------M------------MMMM---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++12: Alternative Yeast Nuclear+Amino acids  FFLLSSSSYY**CC*WLLLSPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons -------------------M---------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++13: Ascidian Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSSGGVVVVAAAADDEEGGGG+Start codons ---M------------------------------MM---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++14: Alternative Flatworm Mitochondrial+Amino acids  FFLLSSSSYYY*CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNNKSSSSVVVVAAAADDEEGGGG+Start codons -----------------------------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++16: Chlorophycean Mitochondrial+Amino acids  FFLLSSSSYY*LCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons -----------------------------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++21: Trematode Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNNKSSSSVVVVAAAADDEEGGGG+Start codons -----------------------------------M---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++22: Scenedesmus obliquus mitochondrial+Amino acids  FFLLSS*SYY*LCC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons -----------------------------------M----------------------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++23: Thraustochytrium mitochondrial code+Amino acids  FF*LSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons --------------------------------M--M---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++24: Pterobranchia Mitochondrial+Amino acids  FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSSKVVVVAAAADDEEGGGG+Start codons ---M---------------M---------------M---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG++25: Candidate Division SR1 and Gracilibacteria+Amino acids  FFLLSSSSYY**CCGWLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG+Start codons ---M-------------------------------M---------------M------------+Base 1       TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG+Base 2       TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG+Base 3       TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG
+ tests/properties.hs view
@@ -0,0 +1,8 @@++module Main where++++main ∷ IO ()+main = return ()+