packages feed

cobot-tools 0.1.1.0 → 0.1.2.0

raw patch · 7 files changed

+658/−336 lines, 7 filesdep +random

Dependencies added: random

Files

ChangeLog.md view
@@ -2,6 +2,11 @@  ## [Unreleased] +## [0.1.2.0] - 2019-12-5+### Added+- wrike-426952824 : added Ecoli and CHO codon tables+- forbidden sequences as parameter+ ## [0.1.1.0] - 2019-11-13 ### Added - Codon optimization tool
cobot-tools.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 1d89fad89173ca2b6e911afc77c4c881a041f3b7fee7a1da594289e32d6d1b22+-- hash: ea5b0488b2bf324cf7921fa277e07d923d6a1eee5bb0f9e6a940db2753897610  name:           cobot-tools-version:        0.1.1.0+version:        0.1.2.0 synopsis:       Biological data file formats and IO description:    Please see the README on GitHub at <https://github.com/less-wrong/cobot-tools#readme> category:       Bio@@ -30,7 +30,8 @@ library   exposed-modules:       Bio.Tools.Sequence.CodonOptimization.Algo-      Bio.Tools.Sequence.CodonOptimization.Type+      Bio.Tools.Sequence.CodonOptimization.Constants+      Bio.Tools.Sequence.CodonOptimization.Types       Bio.Tools.Sequence.Primers.Constants       Bio.Tools.Sequence.Primers.Optimization       Bio.Tools.Sequence.Primers.Properties@@ -91,6 +92,7 @@     , lens >=4.16 && <5.0     , mtl >=2.2.1 && <2.3.0     , neat-interpolation >=0.3+    , random     , regex-tdfa     , text   default-language: Haskell2010
src/Bio/Tools/Sequence/CodonOptimization/Algo.hs view
@@ -2,29 +2,31 @@     ( optimizeAA     , optimizeDNA     , score+    , scoreSequence     , scoreCmp     ) where -import           Bio.NucleicAcid.Nucleotide                (symbol)-import           Bio.NucleicAcid.Nucleotide.Type           (DNA (..))-import           Bio.Protein.AminoAcid.Type                (AA (..))-import           Bio.Tools.Sequence.CodonOptimization.Type (CodonConfig (..), CodonScoreConfig (..),-                                                            ak2Codon,-                                                            ak2MaxFrequCodon,-                                                            codon2ak,-                                                            codonFrequencies,-                                                            forbiddenRegexp,-                                                            standardTemperature)-import           Bio.Tools.Sequence.ViennaRNA.Fold         (fold)-import           Data.List                                 (maximumBy, take, foldl')-import           Data.Map                                  as Map (lookup)-import           Data.Maybe                                (fromMaybe)-import           Text.Regex.TDFA+import           Bio.NucleicAcid.Nucleotide                     (symbol)+import           Bio.NucleicAcid.Nucleotide.Type                (DNA (..))+import           Bio.Protein.AminoAcid.Type                     (AA (..))+import           Bio.Tools.Sequence.CodonOptimization.Constants (ak2Codon, ak2MaxFrequCodon,+                                                                 codon2ak,+                                                                 codonFrequencies, motiveScoreWindow, defaultMotiveScore, +                                                                 forbiddenMotiveScore)+import           Bio.Tools.Sequence.CodonOptimization.Types     (CodonScoreConfig (..),+                                                                 standardTemperature)+import           Bio.Tools.Sequence.ViennaRNA.Fold              (fold)+import           Data.List                                      (foldl',+                                                                 maximumBy,+                                                                 take)+import           Data.Map                                       as Map (lookup)+import           Data.Maybe                                     (fromMaybe)+import           Text.Regex.TDFA                                ((=~))  -- | 'optimizeDNA' function does translation from [DNA] to [AA] and then calls 'optimizeAA'-optimizeDNA :: CodonConfig -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function-            -> [DNA]       -- ^ Initial, not optimized nucleotide sequence-            -> [DNA]       -- ^ Result, optimized nucleotide sequence+optimizeDNA :: CodonScoreConfig -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function+            -> [DNA]            -- ^ Initial, not optimized nucleotide sequence+            -> [DNA]            -- ^ Result, optimized nucleotide sequence optimizeDNA cfg dna = optimizeAA cfg (translate dna)   where     translate :: [DNA] -> [AA]@@ -37,14 +39,15 @@ -- | 'optimizeAA' function does codon-optimisation for incoming amino-acid sequence. -- Incoming amino-acid sequence transformed to nucleotide sequence and optimized used the codon-optimization algorithm. -- Algorithm described here doi: 10.1007/s11693-010-9062-3-optimizeAA :: CodonConfig  -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function-           -> [AA]         -- ^ Initial, not optimized amino-acid sequence-           -> [DNA]        -- ^ Result, optimized nucleotide sequence-optimizeAA cfg@(CodonConfig initLen winLen _) aa = foldl' concatByScore initial variants+optimizeAA :: CodonScoreConfig  -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function+           -> [AA]              -- ^ Initial, not optimized amino-acid sequence+           -> [DNA]             -- ^ Result, optimized nucleotide sequence+optimizeAA cfg@(CodonScoreConfig organism initLen winLen _ _ _ _ _ _ _ _ _ _) aa = foldl' concatByScore initial variants   where     lenAA = length aa     variants = generateVariants (drop initLen aa) winLen-    initial = concatMap (\ak -> maybe "" fst (Map.lookup ak ak2MaxFrequCodon)) (take initLen aa)+    fequCodonsMap = ak2MaxFrequCodon organism+    initial = concatMap (\ak -> maybe "" fst (Map.lookup ak fequCodonsMap)) (take initLen aa)      -- | 'concatByScore' function gets maximum by score variable string and then concat it to result string     concatByScore :: [DNA]   -- ^ initial string@@ -80,14 +83,23 @@ getCodons :: AA -> [[DNA]] getCodons ak = fromMaybe [] (Map.lookup ak ak2Codon) +-- | 'scoreSequence' function calculates the average score for full sequence+scoreSequence :: CodonScoreConfig -> [DNA] -> Double+scoreSequence cnf@(CodonScoreConfig _ initLen winLen _ _ _ _ _ _ _ _ _ _) nkSequ = sum res / realToFrac (length res)+  where+    res = scr ((initLen + winLen + 1) * 3) []++    scr :: Int -> [Double] -> [Double]+    scr partLen acc | partLen > length nkSequ = acc+                    | otherwise = scr (partLen + winLen * 3) (score cnf (take partLen nkSequ) : acc)+ -- | 'score' function gets scoring for incoming string. -- Scoring function is a composite function of several scoring. More about scoring algorithm see here doi: 10.1007/s11693-010-9062-3-score :: CodonConfig  -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function-      -> [DNA]      -- ^ nucleotide sequence to score-      -> Double     -- ^ result score value-score (CodonConfig _ winLen-        (CodonScoreConfig codonUsageWeight gcWeight gcFactor gcWindow rnaFoldingWeight-                        rnaFoldingFactor rnaFoldingWindow forbiddenDNAWeight gcContentDesired)) nkSequ =+score :: CodonScoreConfig  -- ^ Config data object. Contains main parameters of codon-optimization and all parameters for scoring function+      -> [DNA]             -- ^ nucleotide sequence to score+      -> Double            -- ^ result score value+score (CodonScoreConfig organism _ winLen codonUsageWeight gcWeight gcFactor gcWindow rnaFoldingWeight+                        rnaFoldingFactor rnaFoldingWindow forbiddenDNAWeight gcContentDesired forbiddenRegexp) nkSequ =     scoreCU + scoreGC - scoreMT - realToFrac scoreRNAFold   where     sequLen = length nkSequ@@ -123,17 +135,17 @@         countWeightMb :: [DNA] -> Maybe Double         countWeightMb str = do             let codon = take 3 str-            codonFreq         <- Map.lookup codon codonFrequencies+            codonFreq         <- Map.lookup codon (codonFrequencies organism)             ak                <- Map.lookup codon codon2ak-            (_, codonMaxFreq) <- Map.lookup ak ak2MaxFrequCodon+            (_, codonMaxFreq) <- Map.lookup ak (ak2MaxFrequCodon organism)             return $ codonFreq / codonMaxFreq      -- | 'motiveScore' counts score for the occurrence of desired and unwanted DNA motifs.     motiveScore :: [DNA] -> Double     motiveScore sequ =-        if any (drop (length sequ - 100) (map symbol sequ) =~) forbiddenRegexp-            then 50-            else 0+        if any (drop (length sequ - motiveScoreWindow) (map symbol sequ) =~) forbiddenRegexp+            then forbiddenMotiveScore+            else defaultMotiveScore       -- | 'scoreRnaf' counts energy of RNA folding@@ -143,11 +155,8 @@         result = fst $ fold standardTemperature (drop (length sequ - rnaFoldingWindow) sequ)  -- | 'scoreCmp' is compare function for two strings using 'score' function-scoreCmp :: CodonConfig -> [DNA] -> [DNA] -> [DNA] -> Ordering-scoreCmp cfg optimized str1 str2-    | score1 > score2  = GT-    | score1 == score2 = EQ-    | otherwise        = LT+scoreCmp :: CodonScoreConfig -> [DNA] -> [DNA] -> [DNA] -> Ordering+scoreCmp cfg optimized str1 str2 = compare score1 score2   where     score1 = score cfg (optimized ++ str1)     score2 = score cfg (optimized ++ str2)
+ src/Bio/Tools/Sequence/CodonOptimization/Constants.hs view
@@ -0,0 +1,393 @@+module Bio.Tools.Sequence.CodonOptimization.Constants+    ( ak2Codon+    , codon2ak+    , codonFrequencies+    , ak2MaxFrequCodon+    , motiveScoreWindow+    , forbiddenMotiveScore+    , defaultMotiveScore+    ) where+    +import           Bio.NucleicAcid.Nucleotide.Type            (DNA (..))+import           Bio.Protein.AminoAcid.Type                 (AA (..))+import           Bio.Tools.Sequence.CodonOptimization.Types (Organism (..))+import           Data.Map                                   as Map (Map,+                                                                    fromList)++motiveScoreWindow :: Int+motiveScoreWindow = 100++forbiddenMotiveScore :: Double+forbiddenMotiveScore = 50++defaultMotiveScore :: Double+defaultMotiveScore = 0++ak2Codon :: Map AA [[DNA]]+ak2Codon =+    fromList+        [ (PHE, [[DT, DT, DT], [DT, DT, DC]])+        , (TYR, [[DT, DA, DT], [DT, DA, DC]])+        , (CYS, [[DT, DG, DT], [DT, DG, DC]])+        , (TRP, [[DT, DG, DG]])+        , (LEU, [[DT, DT, DA], [DT, DT, DG], [DC, DT, DT], [DC, DT, DC], [DC, DT, DA], [DC, DT, DG]])+        , (PRO, [[DC, DC, DT], [DC, DC, DC], [DC, DC, DA], [DC, DC, DG]])+        , (HIS, [[DC, DA, DT], [DC, DA, DC]])+        , (GLN, [[DC, DA, DA], [DC, DA, DG]])+        , (ILE, [[DA, DT, DT], [DA, DT, DC], [DA, DT, DA]])+        , (MET, [[DA, DT, DG]])+        , (THR, [[DA, DC, DT], [DA, DC, DC], [DA, DC, DA], [DA, DC, DG]])+        , (ASN, [[DA, DA, DT], [DA, DA, DC]])+        , (LYS, [[DA, DA, DA], [DA, DA, DG]])+        , (SER, [[DT, DC, DT], [DT, DC, DC], [DT, DC, DA], [DT, DC, DG], [DA, DG, DT], [DA, DG, DC]])+        , (ARG, [[DC, DG, DT], [DC, DG, DC], [DC, DG, DA], [DC, DG, DG], [DA, DG, DA], [DA, DG, DG]])+        , (VAL, [[DG, DT, DT], [DG, DT, DC], [DG, DT, DA], [DG, DT, DG]])+        , (ALA, [[DG, DC, DT], [DG, DC, DC], [DG, DC, DA], [DG, DC, DG]])+        , (ASP, [[DG, DA, DT], [DG, DA, DC]])+        , (GLU, [[DG, DA, DA], [DG, DA, DG]])+        , (GLY, [[DG, DG, DT], [DG, DG, DC], [DG, DG, DA], [DG, DG, DG]])+        ]+++codon2ak :: Map [DNA] AA+codon2ak =+    fromList+        [ ([DT, DT, DT], PHE)+        , ([DT, DT, DC], PHE)+        , ([DT, DT, DA], LEU)+        , ([DT, DT, DG], LEU)+        , ([DT, DC, DT], SER)+        , ([DT, DC, DC], SER)+        , ([DT, DC, DA], SER)+        , ([DT, DC, DG], SER)+        , ([DT, DA, DT], TYR)+        , ([DT, DA, DC], TYR)+        , ([DT, DG, DT], CYS)+        , ([DT, DG, DC], CYS)+        , ([DT, DG, DG], TRP)+        , ([DC, DT, DT], LEU)+        , ([DC, DT, DC], LEU)+        , ([DC, DT, DA], LEU)+        , ([DC, DT, DG], LEU)+        , ([DC, DC, DT], PRO)+        , ([DC, DC, DC], PRO)+        , ([DC, DC, DA], PRO)+        , ([DC, DC, DG], PRO)+        , ([DC, DA, DT], HIS)+        , ([DC, DA, DC], HIS)+        , ([DC, DA, DA], GLN)+        , ([DC, DA, DG], GLN)+        , ([DC, DG, DT], ARG)+        , ([DC, DG, DC], ARG)+        , ([DC, DG, DA], ARG)+        , ([DC, DG, DG], ARG)+        , ([DA, DT, DT], ILE)+        , ([DA, DT, DC], ILE)+        , ([DA, DT, DA], ILE)+        , ([DA, DT, DG], MET)+        , ([DA, DC, DT], THR)+        , ([DA, DC, DC], THR)+        , ([DA, DC, DA], THR)+        , ([DA, DC, DG], THR)+        , ([DA, DA, DT], ASN)+        , ([DA, DA, DC], ASN)+        , ([DA, DA, DA], LYS)+        , ([DA, DA, DG], LYS)+        , ([DA, DG, DT], SER)+        , ([DA, DG, DC], SER)+        , ([DA, DG, DA], ARG)+        , ([DA, DG, DG], ARG)+        , ([DG, DT, DT], VAL)+        , ([DG, DT, DC], VAL)+        , ([DG, DT, DA], VAL)+        , ([DG, DT, DG], VAL)+        , ([DG, DC, DT], ALA)+        , ([DG, DC, DC], ALA)+        , ([DG, DC, DA], ALA)+        , ([DG, DC, DG], ALA)+        , ([DG, DA, DT], ASP)+        , ([DG, DA, DC], ASP)+        , ([DG, DA, DA], GLU)+        , ([DG, DA, DG], GLU)+        , ([DG, DG, DT], GLY)+        , ([DG, DG, DC], GLY)+        , ([DG, DG, DA], GLY)+        , ([DG, DG, DG], GLY)+        ]++ak2MaxFrequCodon :: Organism -> Map AA ([DNA], Double)+-- taken from https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables/blob/master/codon_usage_data/tables/h_sapiens_9606.csv+ak2MaxFrequCodon Human =+    fromList+        [ (ALA, ([DG, DC, DC], 0.4))+        , (CYS, ([DT, DG, DC], 0.54))+        , (ASP, ([DG, DA, DC], 0.54))+        , (GLU, ([DG, DA, DG], 0.58))+        , (PHE, ([DT, DT, DC], 0.54))+        , (GLY, ([DG, DG, DC], 0.34))+        , (HIS, ([DC, DA, DC], 0.58))+        , (ILE, ([DA, DT, DC], 0.47))+        , (LYS, ([DA, DA, DG], 0.57))+        , (LEU, ([DC, DT, DG], 0.4))+        , (MET, ([DA, DT, DG], 1.0))+        , (ASN, ([DA, DA, DC], 0.53))+        , (PRO, ([DC, DC, DC], 0.32))+        , (GLN, ([DC, DA, DG], 0.73))+        , (ARG, ([DA, DG, DG], 0.21))+        , (SER, ([DA, DG, DC], 0.24))+        , (THR, ([DA, DC, DC], 0.36))+        , (VAL, ([DG, DT, DG], 0.46))+        , (TRP, ([DT, DG, DG], 1.0))+        , (TYR, ([DT, DA, DC], 0.56))+        ]+-- taken from https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables/blob/master/codon_usage_data/tables/e_coli_316407.csv+ak2MaxFrequCodon EColi =+    fromList+        [ (ALA, ([DG, DC, DG], 0.36))+        , (CYS, ([DT, DG, DC], 0.56))+        , (ASP, ([DG, DA, DT], 0.63))+        , (GLU, ([DG, DA, DA], 0.68))+        , (PHE, ([DT, DT, DT], 0.58))+        , (GLY, ([DG, DG, DC], 0.41))+        , (HIS, ([DC, DA, DT], 0.57))+        , (ILE, ([DA, DT, DT], 0.51))+        , (LYS, ([DA, DA, DA], 0.76))+        , (LEU, ([DC, DT, DG], 0.50))+        , (MET, ([DA, DT, DG], 1.0))+        , (ASN, ([DA, DA, DC], 0.55))+        , (PRO, ([DC, DC, DG], 0.53))+        , (GLN, ([DC, DA, DG], 0.65))+        , (ARG, ([DC, DG, DC], 0.4))+        , (SER, ([DA, DG, DC], 0.28))+        , (THR, ([DA, DC, DC], 0.44))+        , (VAL, ([DG, DT, DG], 0.37))+        , (TRP, ([DT, DG, DG], 1.0))+        , (TYR, ([DT, DA, DT], 0.57))+        ]+-- taken from https://www.genscript.com/tools/codon-frequency-table+ak2MaxFrequCodon CHO =+    fromList+        [ (ALA, ([DG, DC, DC], 0.26))+        , (CYS, ([DT, DG, DC], 0.54))+        , (ASP, ([DG, DA, DT], 0.63))+        , (GLU, ([DG, DA, DA], 0.68))+        , (PHE, ([DT, DT, DT], 0.58))+        , (GLY, ([DG, DG, DC], 0.37))+        , (HIS, ([DC, DA, DT], 0.57))+        , (ILE, ([DA, DT, DT], 0.49))+        , (LYS, ([DA, DA, DA], 0.74))+        , (LEU, ([DC, DT, DG], 0.47))+        , (MET, ([DA, DT, DG], 1.0))+        , (ASN, ([DA, DA, DC], 0.51))+        , (PRO, ([DC, DC, DG], 0.49))+        , (GLN, ([DC, DA, DG], 0.66))+        , (ARG, ([DC, DG, DC], 0.36))+        , (SER, ([DA, DG, DC], 0.25))+        , (THR, ([DA, DC, DC], 0.4))+        , (VAL, ([DG, DT, DG], 0.35))+        , (TRP, ([DT, DG, DG], 1.0))+        , (TYR, ([DT, DA, DT], 0.59))+        ]++codonFrequencies :: Organism -> Map [DNA] Double+-- taken from https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables/blob/master/codon_usage_data/tables/h_sapiens_9606.csv+codonFrequencies Human =+    fromList+        [ ([DT, DA, DA], 0.30)+        , ([DT, DA, DG], 0.24)+        , ([DT, DG, DA], 0.47)+        , ([DG, DC, DA], 0.23)+        , ([DG, DC, DC], 0.40)+        , ([DG, DC, DG], 0.11)+        , ([DG, DC, DT], 0.27)+        , ([DT, DG, DC], 0.54)+        , ([DT, DG, DT], 0.46)+        , ([DG, DA, DC], 0.54)+        , ([DG, DA, DT], 0.46)+        , ([DG, DA, DA], 0.42)+        , ([DG, DA, DG], 0.58)+        , ([DT, DT, DC], 0.54)+        , ([DT, DT, DT], 0.46)+        , ([DG, DG, DA], 0.25)+        , ([DG, DG, DC], 0.34)+        , ([DG, DG, DG], 0.25)+        , ([DG, DG, DT], 0.16)+        , ([DC, DA, DC], 0.58)+        , ([DC, DA, DT], 0.42)+        , ([DA, DT, DA], 0.17)+        , ([DA, DT, DC], 0.47)+        , ([DA, DT, DT], 0.36)+        , ([DA, DA, DA], 0.43)+        , ([DA, DA, DG], 0.57)+        , ([DC, DT, DA], 0.07)+        , ([DC, DT, DC], 0.20)+        , ([DC, DT, DG], 0.40)+        , ([DC, DT, DT], 0.13)+        , ([DT, DT, DA], 0.08)+        , ([DT, DT, DG], 0.13)+        , ([DA, DT, DG], 1.00)+        , ([DA, DA, DC], 0.53)+        , ([DA, DA, DT], 0.47)+        , ([DC, DC, DA], 0.28)+        , ([DC, DC, DC], 0.32)+        , ([DC, DC, DG], 0.11)+        , ([DC, DC, DT], 0.29)+        , ([DC, DA, DA], 0.27)+        , ([DC, DA, DG], 0.73)+        , ([DA, DG, DA], 0.21)+        , ([DA, DG, DG], 0.21)+        , ([DC, DG, DA], 0.11)+        , ([DC, DG, DC], 0.18)+        , ([DC, DG, DG], 0.20)+        , ([DC, DG, DT], 0.08)+        , ([DA, DG, DC], 0.24)+        , ([DA, DG, DT], 0.15)+        , ([DT, DC, DA], 0.15)+        , ([DT, DC, DC], 0.22)+        , ([DT, DC, DG], 0.05)+        , ([DT, DC, DT], 0.19)+        , ([DA, DC, DA], 0.28)+        , ([DA, DC, DC], 0.36)+        , ([DA, DC, DG], 0.11)+        , ([DA, DC, DT], 0.25)+        , ([DG, DT, DA], 0.12)+        , ([DG, DT, DC], 0.24)+        , ([DG, DT, DG], 0.46)+        , ([DG, DT, DT], 0.18)+        , ([DT, DG, DG], 1.00)+        , ([DT, DA, DC], 0.56)+        , ([DT, DA, DT], 0.44)+        ]+-- taken from https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables/blob/master/codon_usage_data/tables/e_coli_316407.csv+codonFrequencies EColi =+    fromList+        [ ([DG, DC, DA], 0.21)+        , ([DG, DC, DC], 0.27)+        , ([DG, DC, DG], 0.36)+        , ([DG, DC, DT], 0.16)+        , ([DT, DG, DC], 0.56)+        , ([DT, DG, DT], 0.44)+        , ([DG, DA, DC], 0.37)+        , ([DG, DA, DT], 0.63)+        , ([DG, DA, DA], 0.69)+        , ([DG, DA, DG], 0.31)+        , ([DT, DT, DC], 0.43)+        , ([DT, DT, DT], 0.57)+        , ([DG, DG, DA], 0.11)+        , ([DG, DG, DC], 0.41)+        , ([DG, DG, DG], 0.15)+        , ([DG, DG, DT], 0.34)+        , ([DC, DA, DC], 0.43)+        , ([DC, DA, DT], 0.57)+        , ([DA, DT, DA], 0.07)+        , ([DA, DT, DC], 0.42)+        , ([DA, DT, DT], 0.51)+        , ([DA, DA, DA], 0.76)+        , ([DA, DA, DG], 0.24)+        , ([DC, DT, DA], 0.04)+        , ([DC, DT, DC], 0.10)+        , ([DC, DT, DG], 0.50)+        , ([DC, DT, DT], 0.10)+        , ([DT, DT, DA], 0.13)+        , ([DT, DT, DG], 0.13)+        , ([DA, DT, DG], 1.00)+        , ([DA, DA, DC], 0.55)+        , ([DA, DA, DT], 0.45)+        , ([DC, DC, DA], 0.19)+        , ([DC, DC, DC], 0.12)+        , ([DC, DC, DG], 0.53)+        , ([DC, DC, DT], 0.16)+        , ([DC, DA, DA], 0.35)+        , ([DC, DA, DG], 0.65)+        , ([DA, DG, DA], 0.04)+        , ([DA, DG, DG], 0.02)+        , ([DC, DG, DA], 0.06)+        , ([DC, DG, DC], 0.40)+        , ([DC, DG, DG], 0.10)+        , ([DC, DG, DT], 0.38)+        , ([DA, DG, DC], 0.28)+        , ([DA, DG, DT], 0.15)+        , ([DT, DC, DA], 0.12)+        , ([DT, DC, DC], 0.15)+        , ([DT, DC, DG], 0.15)+        , ([DT, DC, DT], 0.15)+        , ([DA, DC, DA], 0.13)+        , ([DA, DC, DC], 0.44)+        , ([DA, DC, DG], 0.27)+        , ([DA, DC, DT], 0.16)+        , ([DG, DT, DA], 0.15)+        , ([DG, DT, DC], 0.22)+        , ([DG, DT, DG], 0.37)+        , ([DG, DT, DT], 0.26)+        , ([DT, DG, DG], 1.00)+        , ([DT, DA, DC], 0.43)+        , ([DT, DA, DT], 0.57)+        ]+-- taken from https://www.genscript.com/tools/codon-frequency-table+codonFrequencies CHO =+    fromList+        [ ([DT, DT, DT], 0.47)+        , ([DT, DT, DC], 0.53)+        , ([DT, DT, DA], 0.07)+        , ([DT, DT, DG], 0.14)+        , ([DT, DC, DT], 0.22)+        , ([DT, DC, DC], 0.22)+        , ([DT, DC, DA], 0.14)+        , ([DT, DC, DG], 0.05)+        , ([DT, DA, DT], 0.44)+        , ([DT, DA, DC], 0.56)+        , ([DT, DA, DA], 0.26)+        , ([DT, DA, DG], 0.22)+        , ([DT, DG, DT], 0.47)+        , ([DT, DG, DC], 0.53)+        , ([DT, DG, DA], 0.53)+        , ([DT, DG, DG], 1.00)+        , ([DC, DT, DT], 0.13)+        , ([DC, DT, DC], 0.19)+        , ([DC, DT, DA], 0.08)+        , ([DC, DT, DG], 0.39)+        , ([DC, DC, DT], 0.31)+        , ([DC, DC, DC], 0.32)+        , ([DC, DC, DA], 0.29)+        , ([DC, DC, DG], 0.08)+        , ([DC, DA, DT], 0.44)+        , ([DC, DA, DC], 0.56)+        , ([DC, DA, DA], 0.24)+        , ([DC, DA, DG], 0.76)+        , ([DC, DG, DT], 0.11)+        , ([DC, DG, DC], 0.18)+        , ([DC, DG, DA], 0.14)+        , ([DC, DG, DG], 0.19)+        , ([DA, DT, DT], 0.35)+        , ([DA, DT, DC], 0.51)+        , ([DA, DT, DA], 0.14)+        , ([DA, DT, DG], 1.00)+        , ([DA, DC, DT], 0.26)+        , ([DA, DC, DC], 0.37)+        , ([DA, DC, DA], 0.29)+        , ([DA, DC, DG], 0.08)+        , ([DA, DA, DT], 0.45)+        , ([DA, DA, DC], 0.55)+        , ([DA, DA, DA], 0.39)+        , ([DA, DA, DG], 0.61)+        , ([DA, DG, DT], 0.15)+        , ([DA, DG, DC], 0.22)+        , ([DA, DG, DA], 0.19)+        , ([DA, DG, DG], 0.19)+        , ([DG, DT, DT], 0.18)+        , ([DG, DT, DC], 0.24)+        , ([DG, DT, DA], 0.12)+        , ([DG, DT, DG], 0.46)+        , ([DG, DC, DT], 0.32)+        , ([DG, DC, DC], 0.37)+        , ([DG, DC, DA], 0.23)+        , ([DG, DC, DG], 0.07)+        , ([DG, DA, DT], 0.47)+        , ([DG, DA, DC], 0.53)+        , ([DG, DA, DA], 0.41)+        , ([DG, DA, DG], 0.59)+        , ([DG, DG, DT], 0.20)+        , ([DG, DG, DC], 0.34)+        , ([DG, DG, DA], 0.25)+        , ([DG, DG, DG], 0.21)+        ]
− src/Bio/Tools/Sequence/CodonOptimization/Type.hs
@@ -1,251 +0,0 @@-module Bio.Tools.Sequence.CodonOptimization.Type-    ( CodonConfig(..)-    , CodonScoreConfig(..)-    , ak2Codon-    , codon2ak-    , forbiddenRegexp-    , codonFrequencies-    , ak2MaxFrequCodon-    , standardTemperature-    ) where--import           Bio.NucleicAcid.Nucleotide.Type (DNA (..))-import           Bio.Protein.AminoAcid.Type      (AA (..))-import qualified Data.ByteString.Lazy            as BSL (ByteString)-import           Data.Default                    (Default (..), def)-import           Data.Map                        as Map (Map, fromList)--standardTemperature :: Double-standardTemperature = 37---- | all parameters for codon optimization-data CodonConfig =-     CodonConfig-        { initLen   :: Int              -- ^ number of first ak from initial sequence, which will optimised without scoring function-        , windowLen :: Int              -- ^ length of variation window-        , scoreConf :: CodonScoreConfig -- ^ parameters for scoring function-        } deriving (Show)---- | all parameters for scoring function of codon optimization-data CodonScoreConfig =-    CodonScoreConfig-        { codonUsageWeight   :: Double -- ^ Codon usage weight-        , gcWeight           :: Double -- ^ GC-content weight-        , gcFactor           :: Double -- ^ GC_score in the power of F_gc is used-        , gcWindow           :: Int    -- ^ length of the window for GC-score calculation (bp)-        , rnaFoldingWeight   :: Float  -- ^ Weight of the RNA folding score-        , rnaFoldingFactor   :: Float  -- ^ RNA folding score in the power of F_rnaf is used-        , rnaFoldingWindow   :: Int    -- ^ length of the window for RNA folding score calculation (bp)-        , forbiddenDNAWeight :: Double -- ^ forbidden DNA motifs score weight-        , gcContentDesired   :: Int    -- ^ desired gc content in percents-        } deriving (Show)--instance Default CodonScoreConfig where-  def = CodonScoreConfig 1 0.5 1.4 40 0.001 2.6 100 1 43--instance Default CodonConfig where-  def = CodonConfig 3 1 def--forbiddenRegexp :: [BSL.ByteString]-forbiddenRegexp =-    [ "ATTTA"-    , "ATACTCCCCC"-    , "CGATCG"-    , "GGGGACTTTGCACTGGAACTTACAACACCCCAGCAAGGACGCG"-    , "CCGGCGGGT"-    , "TTTATAATTTCTTCTTCCAGAA"-    , "CCGTGCTGGCGTCTG"-    , "AATAAA.{10,30}CA{30,}(TCTG|TG.CT)"-    , "(GGG|CCA)CGCCTATAAA(((C|T)(C|T)A.(T|A)(C|T)(C|T))|(TCA(G|T)T(T|C)))(A|G)G(A|T)(C|T)(G|A|C)"-    , "CAGG"-    , "(A|C)AGGT(A|G)AGT"-    , "AATAAA"-    , "GCC(A|G)CCATGG"-    ]--ak2Codon :: Map AA [[DNA]]-ak2Codon =-    fromList-        [ (PHE, [[DT, DT, DT], [DT, DT, DC]])-        , (TYR, [[DT, DA, DT], [DT, DA, DC]])-        , (CYS, [[DT, DG, DT], [DT, DG, DC]])-        , (TRP, [[DT, DG, DG]])-        , (LEU, [[DT, DT, DA], [DT, DT, DG], [DC, DT, DT], [DC, DT, DC], [DC, DT, DA], [DC, DT, DG]])-        , (PRO, [[DC, DC, DT], [DC, DC, DC], [DC, DC, DA], [DC, DC, DG]])-        , (HIS, [[DC, DA, DT], [DC, DA, DC]])-        , (GLN, [[DC, DA, DA], [DC, DA, DG]])-        , (ILE, [[DA, DT, DT], [DA, DT, DC], [DA, DT, DA]])-        , (MET, [[DA, DT, DG]])-        , (THR, [[DA, DC, DT], [DA, DC, DC], [DA, DC, DA], [DA, DC, DG]])-        , (ASN, [[DA, DA, DT], [DA, DA, DC]])-        , (LYS, [[DA, DA, DA], [DA, DA, DG]])-        , (SER, [[DT, DC, DT], [DT, DC, DC], [DT, DC, DA], [DT, DC, DG], [DA, DG, DT], [DA, DG, DC]])-        , (ARG, [[DC, DG, DT], [DC, DG, DC], [DC, DG, DA], [DC, DG, DG], [DA, DG, DA], [DA, DG, DG]])-        , (VAL, [[DG, DT, DT], [DG, DT, DC], [DG, DT, DA], [DG, DT, DG]])-        , (ALA, [[DG, DC, DT], [DG, DC, DC], [DG, DC, DA], [DG, DC, DG]])-        , (ASP, [[DG, DA, DT], [DG, DA, DC]])-        , (GLU, [[DG, DA, DA], [DG, DA, DG]])-        , (GLY, [[DG, DG, DT], [DG, DG, DC], [DG, DG, DA], [DG, DG, DG]])-        ]---ak2MaxFrequCodon :: Map AA ([DNA], Double)-ak2MaxFrequCodon =-    fromList-        [ (ALA, ([DG, DC, DC], 0.4))-        , (CYS, ([DT, DG, DC], 0.54))-        , (ASP, ([DG, DA, DC], 0.54))-        , (GLU, ([DG, DA, DG], 0.58))-        , (PHE, ([DT, DT, DC], 0.54))-        , (GLY, ([DG, DG, DC], 0.34))-        , (HIS, ([DC, DA, DC], 0.58))-        , (ILE, ([DA, DT, DC], 0.47))-        , (LYS, ([DA, DA, DG], 0.57))-        , (LEU, ([DC, DT, DG], 0.4))-        , (MET, ([DA, DT, DG], 1.0))-        , (ASN, ([DA, DA, DC], 0.53))-        , (PRO, ([DC, DC, DC], 0.32))-        , (GLN, ([DC, DA, DG], 0.73))-        , (ARG, ([DA, DG, DG], 0.21))-        , (SER, ([DA, DG, DC], 0.24))-        , (THR, ([DA, DC, DC], 0.36))-        , (VAL, ([DG, DT, DG], 0.46))-        , (TRP, ([DT, DG, DG], 1.0))-        , (TYR, ([DT, DA, DC], 0.56))-        ]--codon2ak :: Map [DNA] AA-codon2ak =-    fromList-        [ ([DT, DT, DT], PHE)-        , ([DT, DT, DC], PHE)-        , ([DT, DT, DA], LEU)-        , ([DT, DT, DG], LEU)-        , ([DT, DC, DT], SER)-        , ([DT, DC, DC], SER)-        , ([DT, DC, DA], SER)-        , ([DT, DC, DG], SER)-        , ([DT, DA, DT], TYR)-        , ([DT, DA, DC], TYR)-        , ([DT, DG, DT], CYS)-        , ([DT, DG, DC], CYS)-        , ([DT, DG, DG], TRP)-        , ([DC, DT, DT], LEU)-        , ([DC, DT, DC], LEU)-        , ([DC, DT, DA], LEU)-        , ([DC, DT, DG], LEU)-        , ([DC, DC, DT], PRO)-        , ([DC, DC, DC], PRO)-        , ([DC, DC, DA], PRO)-        , ([DC, DC, DG], PRO)-        , ([DC, DA, DT], HIS)-        , ([DC, DA, DC], HIS)-        , ([DC, DA, DA], GLN)-        , ([DC, DA, DG], GLN)-        , ([DC, DG, DT], ARG)-        , ([DC, DG, DC], ARG)-        , ([DC, DG, DA], ARG)-        , ([DC, DG, DG], ARG)-        , ([DA, DT, DT], ILE)-        , ([DA, DT, DC], ILE)-        , ([DA, DT, DA], ILE)-        , ([DA, DT, DG], MET)-        , ([DA, DC, DT], THR)-        , ([DA, DC, DC], THR)-        , ([DA, DC, DA], THR)-        , ([DA, DC, DG], THR)-        , ([DA, DA, DT], ASN)-        , ([DA, DA, DC], ASN)-        , ([DA, DA, DA], LYS)-        , ([DA, DA, DG], LYS)-        , ([DA, DG, DT], SER)-        , ([DA, DG, DC], SER)-        , ([DA, DG, DA], ARG)-        , ([DA, DG, DG], ARG)-        , ([DG, DT, DT], VAL)-        , ([DG, DT, DC], VAL)-        , ([DG, DT, DA], VAL)-        , ([DG, DT, DG], VAL)-        , ([DG, DC, DT], ALA)-        , ([DG, DC, DC], ALA)-        , ([DG, DC, DA], ALA)-        , ([DG, DC, DG], ALA)-        , ([DG, DA, DT], ASP)-        , ([DG, DA, DC], ASP)-        , ([DG, DA, DA], GLU)-        , ([DG, DA, DG], GLU)-        , ([DG, DG, DT], GLY)-        , ([DG, DG, DC], GLY)-        , ([DG, DG, DA], GLY)-        , ([DG, DG, DG], GLY)-        ]---- | taken from https://github.com/Edinburgh-Genome-Foundry/codon-usage-tables/blob/master/codon_usage_data/tables/h_sapiens_9606.csv-codonFrequencies :: Map [DNA] Double-codonFrequencies =-    fromList-        [ ([DT, DA, DA], 0.30)-        , ([DT, DA, DG], 0.24)-        , ([DT, DG, DA], 0.47)-        , ([DG, DC, DA], 0.23)-        , ([DG, DC, DC], 0.40)-        , ([DG, DC, DG], 0.11)-        , ([DG, DC, DT], 0.27)-        , ([DT, DG, DC], 0.54)-        , ([DT, DG, DT], 0.46)-        , ([DG, DA, DC], 0.54)-        , ([DG, DA, DT], 0.46)-        , ([DG, DA, DA], 0.42)-        , ([DG, DA, DG], 0.58)-        , ([DT, DT, DC], 0.54)-        , ([DT, DT, DT], 0.46)-        , ([DG, DG, DA], 0.25)-        , ([DG, DG, DC], 0.34)-        , ([DG, DG, DG], 0.25)-        , ([DG, DG, DT], 0.16)-        , ([DC, DA, DC], 0.58)-        , ([DC, DA, DT], 0.42)-        , ([DA, DT, DA], 0.17)-        , ([DA, DT, DC], 0.47)-        , ([DA, DT, DT], 0.36)-        , ([DA, DA, DA], 0.43)-        , ([DA, DA, DG], 0.57)-        , ([DC, DT, DA], 0.07)-        , ([DC, DT, DC], 0.20)-        , ([DC, DT, DG], 0.40)-        , ([DC, DT, DT], 0.13)-        , ([DT, DT, DA], 0.08)-        , ([DT, DT, DG], 0.13)-        , ([DA, DT, DG], 1.00)-        , ([DA, DA, DC], 0.53)-        , ([DA, DA, DT], 0.47)-        , ([DC, DC, DA], 0.28)-        , ([DC, DC, DC], 0.32)-        , ([DC, DC, DG], 0.11)-        , ([DC, DC, DT], 0.29)-        , ([DC, DA, DA], 0.27)-        , ([DC, DA, DG], 0.73)-        , ([DA, DG, DA], 0.21)-        , ([DA, DG, DG], 0.21)-        , ([DC, DG, DA], 0.11)-        , ([DC, DG, DC], 0.18)-        , ([DC, DG, DG], 0.20)-        , ([DC, DG, DT], 0.08)-        , ([DA, DG, DC], 0.24)-        , ([DA, DG, DT], 0.15)-        , ([DT, DC, DA], 0.15)-        , ([DT, DC, DC], 0.22)-        , ([DT, DC, DG], 0.05)-        , ([DT, DC, DT], 0.19)-        , ([DA, DC, DA], 0.28)-        , ([DA, DC, DC], 0.36)-        , ([DA, DC, DG], 0.11)-        , ([DA, DC, DT], 0.25)-        , ([DG, DT, DA], 0.12)-        , ([DG, DT, DC], 0.24)-        , ([DG, DT, DG], 0.46)-        , ([DG, DT, DT], 0.18)-        , ([DT, DG, DG], 1.00)-        , ([DT, DA, DC], 0.56)-        , ([DT, DA, DT], 0.44)-        ]
+ src/Bio/Tools/Sequence/CodonOptimization/Types.hs view
@@ -0,0 +1,55 @@+module Bio.Tools.Sequence.CodonOptimization.Types+    ( CodonScoreConfig(..)+    , Organism(..)+    , standardTemperature+    , defaultForbiddenRegexp+    ) where++import qualified Data.ByteString.Lazy as BSL (ByteString)+import           Data.Default                (Default (..))+import           GHC.Generics                (Generic)++standardTemperature :: Double+standardTemperature = 37++data Organism = CHO | EColi | Human+    deriving (Eq, Show, Generic)++-- | all parameters for codon optimization+data CodonScoreConfig =+    CodonScoreConfig+        { organism           :: Organism+        , initLen            :: Int                -- ^ number of first ak from initial sequence, which will optimised without scoring function+        , windowLen          :: Int                -- ^ length of variation window+        , codonUsageWeight   :: Double             -- ^ Codon usage weight+        , gcWeight           :: Double             -- ^ GC-content weight+        , gcFactor           :: Double             -- ^ GC_score in the power of F_gc is used+        , gcWindow           :: Int                -- ^ length of the window for GC-score calculation (bp)+        , rnaFoldingWeight   :: Float              -- ^ Weight of the RNA folding score+        , rnaFoldingFactor   :: Float              -- ^ RNA folding score in the power of F_rnaf is used+        , rnaFoldingWindow   :: Int                -- ^ length of the window for RNA folding score calculation (bp)+        , forbiddenDNAWeight :: Double             -- ^ forbidden DNA motifs score weight+        , gcContentDesired   :: Int                -- ^ desired gc content in percents+        , forbiddenSequence  :: [BSL.ByteString]   -- ^ list of forbidden patterns+        }+    deriving (Eq, Show, Generic)++instance Default CodonScoreConfig where+  def = CodonScoreConfig CHO 3 1 1 0.5 1.4 40 0.001 2.6 100 1 43 defaultForbiddenRegexp++defaultForbiddenRegexp :: [BSL.ByteString]+defaultForbiddenRegexp =+    [ "ATTTA"+    , "ATACTCCCCC"+    , "CGATCG" -- PvuI+    , "GGGGACTTTGCACTGGAACTTACAACACCCCAGCAAGGACGCG"+    , "CCGGCGGGT"+    , "TTTATAATTTCTTCTTCCAGAA"+    , "CCGTGCTGGCGTCTG"+    , "AATAAA.{10,30}CA{30,}(TCTG|TG.CT)"+    , "(GGG|CCA)CGCCTATAAA(((C|T)(C|T)A.(T|A)(C|T)(C|T))|(TCA(G|T)T(T|C)))(A|G)G(A|T)(C|T)(G|A|C)"+    , "CAGG"+    , "(A|C)AGGT(A|G)AGT"+    , "AATAAA"+    , "GCC(A|G)CCATGG"+    ]
test/SpecCodonOptimization.hs view
@@ -2,26 +2,74 @@  module SpecCodonOptimization where -import           Bio.Protein.AminoAcid                     ()-import           Bio.Tools.Sequence.CodonOptimization.Algo (optimizeAA, optimizeDNA, score,-                                                            scoreCmp)-import           Bio.Tools.Sequence.CodonOptimization.Type (CodonConfig (..), CodonScoreConfig (..))-import           Data.Default                              (def)-import           Data.List                                 (maximumBy,-                                                            minimumBy)-import           Test.Hspec                                (Spec, describe, it,-                                                            shouldBe)+import           Bio.NucleicAcid.Nucleotide.Type                (DNA)+import           Bio.Protein.AminoAcid                          ()+import           Bio.Protein.AminoAcid.Type                     (AA)+import           Bio.Tools.Sequence.CodonOptimization.Algo      (optimizeAA,+                                                                 optimizeDNA,+                                                                 score,+                                                                 scoreCmp,+                                                                 scoreSequence)+import           Bio.Tools.Sequence.CodonOptimization.Constants (ak2Codon)+import           Bio.Tools.Sequence.CodonOptimization.Types     (CodonScoreConfig(..),+                                                                 Organism (..),+                                                                 defaultForbiddenRegexp)+import           Data.List                                      (foldl',+                                                                 maximumBy,+                                                                 minimumBy)+import           Data.Map                                       as Map (lookup)+import           Data.Maybe                                     (fromMaybe)+import           System.Random+import           Test.Hspec                                     (Expectation,+                                                                 Spec, describe,+                                                                 it, shouldBe,+                                                                 shouldSatisfy) -scoreCfg :: CodonScoreConfig-scoreCfg = def+confHuman :: CodonScoreConfig+confHuman = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 100 1 60 defaultForbiddenRegexp -conf :: CodonConfig-conf = def+confEColi :: CodonScoreConfig+confEColi = CodonScoreConfig EColi 3 1 1 0.5 1.4 40 0.001 2.6 100 1 50 defaultForbiddenRegexp +confCHO :: CodonScoreConfig+confCHO = CodonScoreConfig CHO 3 1 1 0.5 1.4 40 0.001 2.6 100 1 43 defaultForbiddenRegexp++scoreHuman :: [DNA] -> Double+scoreHuman = scoreSequence confHuman++scoreCHO :: [DNA] -> Double+scoreCHO = scoreSequence confCHO++scoreEColi :: [DNA] -> Double+scoreEColi = scoreSequence confEColi++assertScoreBecomeBetter :: CodonScoreConfig -> [DNA] -> [DNA] -> Expectation+assertScoreBecomeBetter conf res initial = scoreSequence conf initial `shouldSatisfy` (< scoreSequence conf res)++assertScoreByHumanBetterThan :: [DNA] -> [DNA] -> Expectation+assertScoreByHumanBetterThan res initial = scoreHuman initial `shouldSatisfy` (< scoreHuman res)++assertScoreByCHOBetterThan :: [DNA] -> [DNA] -> Expectation+assertScoreByCHOBetterThan res initial = scoreCHO initial `shouldSatisfy` (< scoreCHO res)++assertScoreByEColiBetterThan :: [DNA] -> [DNA] -> Expectation+assertScoreByEColiBetterThan res initial = scoreEColi initial `shouldSatisfy` (< scoreEColi res)++toRandomNKSequ :: [AA] -> IO [DNA]+toRandomNKSequ initial = foldl' (++) [] <$> mapM toRandomCodon initial++toRandomCodon :: AA -> IO [DNA]+toRandomCodon ak = do+    let codons = fromMaybe [] (Map.lookup ak ak2Codon)+    i <- randomRIO (0, length codons - 1)+    return $ codons !! i+ codonOptimizationSpec :: Spec codonOptimizationSpec =     describe "Codon optimization spec" $ do         optimizeSequence+        optimizeSequenceForEColi+        optimizeSequenceForCHO         optimizeDNASequence         optimizeShortSequence         optimizeExtremelyShortSequence@@ -29,6 +77,7 @@         optimizeSequenceInit5         scoreComparing         scoreFun+        scoreFunEColi         scoreFunDifferentCodonUsageWeight         scoreFunDifferentGCWeight         scoreFunDifferentGCFactor@@ -46,7 +95,7 @@     it "should correct compare by score" $ do         let optimized = "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGC"         let vars = ["AGTACTGGT","AGCACTGGT","TCGACAGGT","AGTACAGGT","AGCACAGGT","TCTACTGGC","TCCACTGGC","TCAACTGGC","TCGACTGGC","AGCACCGGC"]-        let cfg = CodonConfig 3 3 (CodonScoreConfig 1 0.5 1.4 40 0.001 2.6 100 1 43)+        let cfg = CodonScoreConfig Human 3 3 1 0.5 1.4 40 0.001 2.6 100 1 43 defaultForbiddenRegexp         let resMin = maximumBy (scoreCmp cfg optimized) vars         let resMax = minimumBy (scoreCmp cfg optimized) vars         resMax `shouldBe` "TCGACAGGT"@@ -56,61 +105,114 @@ optimizeSequence =     describe "optimizeSequence" $     it "should correct optimize sequence" $ do-        let res = optimizeAA conf "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"-        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTTCCTCTGGCCCCTAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCTGAGCCTGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCTAGCAACACCAAGGTGGACAAGAAGGTG"+        let ak = "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"+        nk <- toRandomNKSequ ak+        let res = optimizeAA confHuman ak +        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTCCCTCTGGCCCCCAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCCGAGCCCGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCCAGCAACACCAAGGTGGACAAGAAGGTG"+        res `assertScoreByHumanBetterThan` nk +optimizeSequenceForCHO :: Spec+optimizeSequenceForCHO =+    describe "optimizeSequenceForCHO" $+    it "should correct optimize sequence for CHO" $ do+        let ak = "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"+        nk <- toRandomNKSequ ak+        let res = optimizeAA confCHO ak++        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTTCCTCTGGCCCCTTCTTCTAAGTCTACCTCTGGCGGCACCGCCGCCCTGGGCTGTCTGGTGAAGGATTACTTTCCTGAGCCTGTGACCGTGTCTTGGAACTCTGGCGCCCTGACCTCTGGCGTGCACACCTTTCCTGCCGTGCTGCAGTCTTCTGGCCTGTACTCTCTGTCTTCTGTGGTGACCGTGCCTTCTTCTTCTCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCTTCTAACACCAAGGTGGACAAGAAGGTG"+        res `assertScoreByCHOBetterThan` nk++optimizeSequenceForEColi :: Spec+optimizeSequenceForEColi =+    describe "optimizeSequenceForEColi" $+    it "should correct optimize sequence for Ecoli" $ do+        let ak = "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"+        nk <- toRandomNKSequ ak+        let res = optimizeAA confEColi ak++        res `shouldBe` "GCGAGCACCAAAGGCCCGAGCGTGTTTCCGCTGGCGCCGAGCAGCAAAAGCACCAGCGGCGGCACCGCGGCGCTGGGCTGCCTGGTGAAAGATTATTTTCCGGAACCGGTGACCGTGAGCTGGAACAGCGGCGCGCTGACCAGCGGCGTGCATACCTTTCCGGCGGTGCTGCAGAGCAGCGGCCTGTATAGCCTGAGCAGCGTGGTGACCGTGCCGAGCAGCAGCCTGGGCACCCAGACCTATATTTGCAACGTGAACCATAAACCGAGCAACACCAAAGTGGATAAAAAAGTG"+        res `assertScoreByEColiBetterThan` nk+ optimizeDNASequence :: Spec optimizeDNASequence =     describe "optimizeDNASequence" $     it "should correct optimize amino-acid sequence" $ do-        let res = optimizeDNA conf "GCTAGTACCAAGGGCCCCAGCGTGTTTCCTCTGGCCCCTAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCTGAGCCTGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCTAGCAACACCAAGGTGGACAAGAAGGTG"-        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTTCCTCTGGCCCCTAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCTGAGCCTGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCTAGCAACACCAAGGTGGACAAGAAGGTG"+        let nk = "GCTAGCACGAAAGGCCCTTCAGTATTCCCCCTCGCACCGTCGAGTAAGTCCACGTCGGGTGGGACGGCGGCTCTAGGATGCTTAGTTAAGGACTATTTTCCAGAGCCTGTCACAGTGTCGTGGAACAGTGGTGCTTTAACCAGCGGTGTCCACACCTTTCCTGCCGTTTTACAAAGTAGTGGTCTTTATTCCCTATCGAGCGTCGTTACGGTTCCCAGTTCGAGTTTGGGGACACAGACATACATTTGTAACGTAAACCACAAACCCTCTAACACGAAAGTCGATAAGAAAGTC"+        let res = optimizeDNA confHuman nk +        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTCCCTCTGGCCCCCAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCCGAGCCCGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCCAGCAACACCAAGGTGGACAAGAAGGTG"+        res `assertScoreByHumanBetterThan` nk+ optimizeShortSequence :: Spec optimizeShortSequence =     describe "optimizeShortSequence" $     it "should correct optimize short sequence" $ do-        let res = optimizeAA conf "METDTLLLWVLLLWVPGSTG"-        res `shouldBe` "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC"+        let ak = "METDTLLLWVLLLWVPGSTG"+        nk <- toRandomNKSequ ak+        let res = optimizeAA confHuman ak +        res `shouldBe` "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCCGGCAGCACCGGC"+        res `assertScoreByHumanBetterThan` nk+ optimizeExtremelyShortSequence :: Spec optimizeExtremelyShortSequence =     describe "optimizeExtremelyShortSequence" $     it "should correct optimize extremely short sequence" $ do-        let res = optimizeAA conf "METDTLL"+        let ak = "METDTLL"+        nk <- toRandomNKSequ ak+        let res = optimizeAA confHuman ak+         res `shouldBe` "ATGGAGACCGACACCCTGCTG"+        res `assertScoreByHumanBetterThan` nk  optimizeSequenceWindow3 :: Spec optimizeSequenceWindow3 =     describe "optimizeSequenceWindow3" $     it "should correct optimize sequence with window 3" $ do-        let conf' = CodonConfig 3 3 scoreCfg-        let res = optimizeAA conf' "METDTLLLWVLLLWVPGSTG"-        res `shouldBe` "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCTCTACCGGC"+        let conf' = CodonScoreConfig Human 3 3 1 0.5 1.4 40 0.001 2.6 100 1 60 defaultForbiddenRegexp+        let ak = "METDTLLLWVLLLWVPGSTG"+        nk <- toRandomNKSequ ak+        let res = optimizeAA conf' ak +        res `shouldBe` "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC"+        assertScoreBecomeBetter conf' res nk+ optimizeSequenceInit5 :: Spec optimizeSequenceInit5 =     describe "optimizeSequenceInit5" $     it "should correct optimize sequence with init param = 5" $ do-        let conf' = CodonConfig 5 1 scoreCfg-        let res = optimizeAA conf' "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"-        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTTCCTCTGGCCCCTAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCTGAGCCTGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCTAGCAACACCAAGGTGGACAAGAAGGTG"+        let conf' = CodonScoreConfig Human 5 1 1 0.5 1.4 40 0.001 2.6 100 1 60 defaultForbiddenRegexp+        let ak = "ASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKV"+        nk <- toRandomNKSequ ak+        let res = optimizeAA conf' ak +        res `shouldBe` "GCCAGCACCAAGGGCCCCAGCGTGTTCCCTCTGGCCCCCAGCAGCAAGAGCACCAGCGGCGGCACCGCCGCCCTGGGCTGCCTGGTGAAGGACTACTTCCCCGAGCCCGTGACCGTGAGCTGGAACAGCGGCGCCCTGACCAGCGGCGTGCACACCTTCCCTGCCGTGCTGCAGAGCAGCGGCCTGTACAGCCTGAGCAGCGTGGTGACCGTGCCTAGCAGCAGCCTGGGCACCCAGACCTACATCTGCAACGTGAACCACAAGCCCAGCAACACCAAGGTGGACAAGAAGGTG"+        assertScoreBecomeBetter conf' res nk+ scoreFun :: Spec scoreFun =     describe "scoreFun" $     it "should correct count score" $ do-        score conf "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 40.88886033302965-        score conf "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 45.91010855311742-        score conf "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"-            `shouldBe` 66.00968914282373+        score confHuman "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 80.83499151084192+        score confHuman "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 80.74362252733329+        score confHuman "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"+            `shouldBe` 96.19662511761598 +scoreFunEColi :: Spec+scoreFunEColi =+    describe "scoreFunEcoli" $+    it "should correct count score for Ecoli" $ do+        score confEColi "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 58.913612822848826+        score confEColi "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 23.025024455733913+        score confEColi "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"+            `shouldBe` 29.501417850070677+ scoreFunDifferentCodonUsageWeight :: Spec scoreFunDifferentCodonUsageWeight =     describe "scoreFunDifferentCodonUsageWeight" $     it "should correct count score with g_cu=9" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 9 0.5 1.4 40 0.001 2.6 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 9 0.5 1.4 40 0.001 2.6 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 840.8888603330297         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 748.8141376168824         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -120,7 +222,7 @@ scoreFunDifferentGCWeight =     describe "scoreFunDifferentGCWeight" $     it "should correct count score with g_gc=0.2" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.2 1.4 40 0.001 2.6 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.2 1.4 40 0.001 2.6 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 75.15554413321186         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 71.08184560102933         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -130,7 +232,7 @@ scoreFunDifferentGCFactor =     describe "scoreFunDifferentGCFactor" $     it "should correct count score with f_gc=1.7" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.7 40 0.001 2.6 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.7 40 0.001 2.6 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` -59.640364905662636         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` -20.530452529069947         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -140,7 +242,7 @@ scoreFunDifferentGCWindow =     describe "scoreFunDifferentGCWindow" $     it "should correct count score with w_gc=10" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 10 0.001 2.6 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 10 0.001 2.6 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 19.575380904184584         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 61.4633338693899         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -150,7 +252,7 @@ scoreFunDifferentFoldingWeight =     describe "scoreFunDifferentFoldingWeight" $     it "should correct count score with weight of folding = 0.03" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 40 0.03 2.6 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.03 2.6 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` -45.11113966697035         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 43.91010855311742         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -160,7 +262,7 @@ scoreFunDifferentFoldingFactor =     describe "scoreFunDifferentFoldingFactor" $     it "should correct count score with folding factor = 4.999" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 40 0.001 4.999 100 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 4.999 100 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` -4644.11113966697         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 42.91010855311742         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -170,7 +272,7 @@ scoreFunDifferentFoldingWindow =     describe "scoreFunDifferentFoldingWindow" $     it "should correct count score with folding window = 23" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 40 0.001 2.6 23 1 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 23 1 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 42.88886033302965         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 45.91010855311742         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"@@ -180,15 +282,22 @@ scoreFunWithForbiddenSeq =     describe "scoreFunWithForbiddenSeq" $     it "should correct count score with forbidden sequence" $ do-        score conf "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCATACTCCCCCGGC" `shouldBe` -3.4521030544284343-        score conf "GCCAGCGGCGACCGGCGGGTCAAGACCCACACCTGTCCT" `shouldBe` -17.346165749671798-        score conf "ACAGCCAGCGAATAAACCCCGAGGCCGCCGGCGGCCCTAGCGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATGACTACAGCCAAG" `shouldBe` 3.4278532842107197+        let confWithoutForbidden = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 23 1 43 []+        score confWithoutForbidden "GACAACCGGAATACCCTGCTGCTGTAGATGCTACTGCTGTGGGTGCCTGGCAGCACCATACTCTCTCGT" `shouldBe` 28.517294972946885+        score confWithoutForbidden "GACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCATACTCCCCCGTAACCGGAAC" `shouldBe` 59.71421227843634+        score confWithoutForbidden "GCCAGCGGCGACCCAAGACCCACACCTGTCCTAGCGGGT" `shouldBe` -12.47745413521671 +        let forbidden = ["AACCGGAAC", "(A|C)..GGG(C|T)"]+        let confWithForbidden = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 23 1 43 forbidden+        score confWithForbidden "GACAACCGGAATACCCTGCTGCTGTAGATGCTACTGCTGTGGGTGCCTGGCAGCACCATACTCTCTCGT" `shouldBe` 28.517294972946885+        score confWithForbidden "GACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCATACTCCCCCGTAACCGGAAC" `shouldBe` 9.714212278436342+        score confWithForbidden "GCCAGCGGCGACCCAAGACCCACACCTGTCCTAGCGGGT" `shouldBe` -62.47745413521671+ scoreFunDifferentForbiddenSeqWeight :: Spec scoreFunDifferentForbiddenSeqWeight =     describe "scoreFunDifferentForbiddenSeqWeight" $     it "should correct count score with forbidden sequence weight = 4" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 40 0.001 2.6 100 4 43)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 100 4 43 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCATACTCCCCCGGC" `shouldBe` -153.45210305442845         score conf' "GCCAGCGGCGACCGGCGGGTCAAGACCCACACCTGTCCT" `shouldBe` -167.3461657496718         score conf' "ACAGCCAGCGAATAAACCCCGAGGCCGCCGGCGGCCCTAGCGTCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATGACTACAGCCAAG" `shouldBe` -146.57214671578927@@ -198,7 +307,7 @@ scoreFunDifferentGCDesired =     describe "scoreFunDifferentGCDesired" $     it "should correct count score with gc desired = 60" $ do-        let conf' = CodonConfig 3 1 (CodonScoreConfig 1 0.5 1.4 40 0.001 2.6 100 1 60)+        let conf' = CodonScoreConfig Human 3 1 1 0.5 1.4 40 0.001 2.6 100 1 60 defaultForbiddenRegexp         score conf' "ATGGAGACCGACACCCTGCTGCTGTGGGTGCTGCTGCTGTGGGTGCCTGGCAGCACCGGC" `shouldBe` 80.83499151084192         score conf' "GCCAGCGGCGACAAGACCCACACCTGTCCT" `shouldBe` 80.74362252733329         score conf' "CCCTGCCCCGCCCCCGAGGCCGCCGGCGGCCCTAGCGTGTTCCTGTTCCCTCCTAAGCCTAAGGACACCCTGATGATCAGCAGAACCCCCGAGGTGACCTGCGTGGTGGTGGACGTGAGCCACGAGGACCCTGAGGTGAAGTTCAATTGGTACGTGGACGGCGTGGAGGTGCACAACGCCAAGACCAAGCCTAGAGAGGAGCAGTACAACAGCACCTACAGAGTGGTGAGCGTGCTGACCGTGCTGCACCAAGACTGGCTGAACGGCAAGGAGTACAAGTGCAAGGTGAGCAACAAGGCCCTGCCCGCCCCTATCGAGAAGACCATCAGCAAGGCCAAG"