{-# 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