dawrehxyz icon

tititlelepupu2F

dawrehxyz | PRO | 09/08/16 04:52:13 PM UTC | 0 ⭐ | 367 👁️ | Never ⏰ | []
Haskell |

2.02 KB

|

None

|

0 👍

/

0 👎

module F2 where
 
dnaLetter = "ACGT"
data SeqTypes = Dna | Protein deriving (Show, Eq)
data MolSeq = MolSeq String String SeqTypes deriving (Show)
 
string2seq :: String -> String -> MolSeq
string2seq namn sekvens = MolSeq namn sekvens (string2seqHelper namn sekvens)
string2seqHelper :: String -> String -> SeqTypes
string2seqHelper namn sekvens
   | (null sekvens) = Dna
   | (head sekvens) `elem` dnaLetter = string2seqHelper namn (tail sekvens)
   | otherwise = Protein
 
seqName :: MolSeq -> String
seqName (MolSeq namn sekvens typ) = namn
 
seqSequence :: MolSeq -> String
seqSequence (MolSeq namn sekvens typ) = sekvens
 
seqType :: MolSeq -> SeqTypes
seqType (MolSeq namn sekvens typ) = typ
 
seqLength :: MolSeq -> Double
seqLength (MolSeq namn sekvens typ) = sum [ 1 | _ <- sekvens] :: Double
 
getAlpha :: MolSeq -> MolSeq -> Double
getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = sum [ if x == y then 1 else 0 | x <- sekvens1, y <- sekvens2] :: Double
checkValidity :: MolSeq -> MolSeq -> Bool
checkValidity (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2) = if typ1 == typ2 then True else False
eDistanceDNA :: MolSeq -> MolSeq -> Double
eDistanceDNA (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  | alpha > 0.74 = 3.3
  | otherwise = (-3/4)*log(1-(4*alpha/3))
  where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1))
        gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
eDistanceProtein :: MolSeq -> MolSeq -> Double
eDistanceProtein (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
  | alpha > 0.94 = 3.7
  | otherwise = (-19/20)*log(1-(20*alpha/19))
  where alpha = gA/(seqLength (MolSeq namn1 sekvens1 typ1))
        gA = getAlpha (MolSeq namn1 sekvens1 typ1) (MolSeq namn2 sekvens2 typ2)
seqDistance :: MolSeq -> MolSeq -> Double
seqDistance molseq1 molseq2 =
  if (checkValidity molseq1 molseq2)
  then (if (seqType molseq1) == Dna then eDistanceDNA molseq1 molseq2 else eDistanceProtein molseq1 molseq2)
  else error "FU BRO"

Comments