dawrehxyz

tititlelepupu2F

Sep 8th, 2016
393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module F2 where
  2.  
  3. dnaLetter = "ACGT"
  4. data SeqTypes = Dna | Protein deriving (Show, Eq)
  5. data MolSeq = MolSeq String String SeqTypes deriving (Show)
  6.  
  7. string2seq :: String -> String -> MolSeq
  8. string2seq namn sekvens = MolSeq namn sekvens (string2seqHelper namn sekvens)
  9. string2seqHelper :: String -> String -> SeqTypes
  10. string2seqHelper namn sekvens
  11.    | (null sekvens) = Dna
  12.    | (head sekvens) `elem` dnaLetter = string2seqHelper namn (tail sekvens)
  13.    | otherwise = Protein
  14.  
  15. seqName :: MolSeq -> String
  16. seqName (MolSeq namn sekvens typ) = namn
  17.  
  18. seqSequence :: MolSeq -> String
  19. seqSequence (MolSeq namn sekvens typ) = sekvens
  20.  
  21. seqType :: MolSeq -> SeqTypes
  22. seqType (MolSeq namn sekvens typ) = typ
  23.  
  24. seqLength :: MolSeq -> Double
  25. seqLength (MolSeq namn sekvens typ) = sum [ 1 | _ <- sekvens] :: Double
  26.  
  27. getAlpha :: MolSeq -> MolSeq -> Double
  28. getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = sum [ if x == y then 1 else 0 | x <- sekvens1, y <- sekvens2] :: Double
  29. checkValidity :: MolSeq -> MolSeq -> Bool
  30. checkValidity (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = if typ1 == typ2 then True else False
  31. eDistanceDNA :: MolSeq -> MolSeq -> Double
  32. eDistanceDNA (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  33.   | alpha > 0.74 = 3.3
  34.   | otherwise = (-3/4)*log(1-(4*alpha/3))
  35.   where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1))
  36.         gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  37. eDistanceProtein :: MolSeq -> MolSeq -> Double
  38. eDistanceProtein (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  39.   | alpha > 0.94 = 3.7
  40.   | otherwise = (-19/20)*log(1-(20*alpha/19))
  41.   where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1))
  42.         gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  43. seqDistance :: MolSeq -> MolSeq -> Double
  44. seqDistance molseq1 molseq2 =
  45.   if (checkValidity molseq1 molseq2)
  46.   then (if (seqType molseq1) == Dna then eDistanceDNA molseq1 molseq2 else eDistanceProtein molseq1 molseq2)
  47.   else error "FU BRO"
Advertisement
Add Comment
Please, Sign In to add comment