packages feed

bio-sequence-0.1.0.0: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

import           Test.Hspec

import Data.Monoid ((<>))
import Data.ByteString.Char8 (ByteString)

import Bio.Sequence.Alignment
import Bio.Sequence.Alignment.Matrix

chains :: [ByteString]
chains = [ "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVA" <>
           "RIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
         , "EVQLVESGGGLVQPGGSLRLSCAASGFTFTDYTMDWVRQAPGKGLEWVA" <>
           "DVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFYFDYWGQGTLVTVSS"
         , "QVQLQQPGAELVKPGASVKMSCKASGYTFTSYNMHWVKQTPGRGLEWIG" <>
           "AIYPGNGDTSYNQKFKGKATLTADKSSSTAYMQLSSLTSEDSAVYYCARSTYYGGDWYFNVWGAGTTVTVSA"
         , "EVQLVESGGGLVQPGRSLRLSCAASGFTFDDYAMHWVRQAPGKGLEWVSAI" <>
           "TWNSGHIDYADSVEGRFTISRDNAKNSLYLQMNSLRAEDTAVYCAKVSYLSTASSLDYWGQGTLVTVSS"
         , "EVQLVESGGGLVQPGGSLRLSCAASGYTFTNYGMNWVRQAPGKGLEWVG" <>
           "WINTYTGEPTYAADFKRRFTFSLDTSKSTAYLQMNSLRAEDTAVYCAKYPHYYGSSHWYFDVWGQGTLVTVSS"
         , "QVQLVQSGVEVKKPGASVKVSCKASGYTFTNYYMYWVRQAPGQGLEWMG" <>
           "GINPSNGGTNFNEKFKNRVTLTTDSSTTTAYMELKSLQFDDTAVYYCARRDYRFDMGFDYWGQGTTVTVSS"
         , "EVQLVESGGGLVQPGGSLRLSCAASGFTFSNYWMNWVRQAPGKGLEWVA" <>
           "AINQDGSEKYYVGSVKGRFTISRDNAKNSLYLQMNSLRVEDTAVYYCVRDYYDILTDYYIHYWYFDLWGRGTLVTVSS"
         ]

combinations :: [Int]
combinations = [fst $ alignment glob x y | x <- chains, y <- chains]
  where glob = mkGlobal blosum62 (-5)

results :: [Int]
results = [ 645, 459, 345, 431, 401, 337, 405, 459, 634, 375, 437, 444
          , 378, 425, 345, 375, 651, 306, 368, 418, 316, 431, 437, 306
          , 628, 413, 312, 423, 401, 444, 368, 413, 669, 337, 436, 337
          , 378, 418, 312, 337, 647, 304, 405, 425, 316, 423, 436, 304, 688]

main :: IO ()
main = hspec $ do
         describe "Edit distance" $ do
           it "align empty strings" $ do
             let (_, (s', t')) = alignment mkEditDistance "" ""
             s' `shouldBe` ""
             t' `shouldBe` ""
           it "align equal strings" $ do
             let (_, (s', t')) = alignment mkEditDistance "AAA" "AAA"
             s' `shouldBe` "AAA"
             t' `shouldBe` "AAA"
         describe "Semiglobal alignment" $ do
           it "align without error" $ do
             let s = "SVAPGQTARITCGEESLGSRSVIWYQQRPGQAPSLIIYNNNDRPSGIPDRFSGSPGSTFGTTATLTITSVEAGDEADYYCHIWDSRRPTNWVFGEGTTLIVL"
             let t = "SSMSVSPGETAKISCGKESIGSRAVQWYQQKPGQPPSLIIYNNQDRPAGVPERFSASPDFRPGTTATLTITNVDAEDEADYYCHIYDARGGTNWVFDRGTTLTVL"
             let (_, (s', _)) = alignment (mkSemiglobal blosum62 (-5)) s t
             s' `shouldBe` "---SVAPGQTARITCGEESLGSRSVIWYQQRPGQAPSLIIYNNNDRPSGIPDRFSGSPGSTFGTTATLTITSVEAGDEADYYCHIWDSRRPTNWVFGEGTTLIVL"
         describe "Global alignment" $ do
           it "align antibodies" $ do
             let (tra : per : _) = chains
             let (score, (s', t')) = alignment (mkGlobal blosum62 (-5)) tra per
             s' `shouldBe` "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTY-IHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
             t' `shouldBe` "EVQLVESGGGLVQPGGSLRLSCAASGFTFTD-YTMDWVRQAPGKGLEWVADVNPNSGGSIYNQRFKGRFTLSVDRSKNTLYLQMNSLRAEDTAVYYCARNLGPSFY-FDYWGQGTLVTVSS"
             score `shouldBe` 459
           it "align fast" $
             combinations `shouldBe` results