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 +5/−0
- cobot-tools.cabal +5/−3
- src/Bio/Tools/Sequence/CodonOptimization/Algo.hs +48/−39
- src/Bio/Tools/Sequence/CodonOptimization/Constants.hs +393/−0
- src/Bio/Tools/Sequence/CodonOptimization/Type.hs +0/−251
- src/Bio/Tools/Sequence/CodonOptimization/Types.hs +55/−0
- test/SpecCodonOptimization.hs +152/−43
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"