Bioinformatics/Sequence mutation: Difference between revisions
Content added Content deleted
Line 946: | Line 946: | ||
i <- randomIndex (length xs) |
i <- randomIndex (length xs) |
||
case m of |
case m of |
||
Swap -> randomDNA >>= \d -> pure ((Swap, i), |
Swap -> randomDNA >>= \d -> pure ((Swap, i), swapElement i d xs) |
||
Insert -> randomDNA >>= \d -> pure ((Insert, i), |
Insert -> randomDNA >>= \d -> pure ((Insert, i), insertElement i d xs) |
||
Delete -> pure ((Delete, i), |
Delete -> pure ((Delete, i), dropElement i xs) |
||
where |
where |
||
dropElement i xs = take (pred i) xs <> drop i xs |
|||
insertElement i e xs = take i xs <> [e] <> drop i xs |
|||
swapElement i a xs = take (pred i) xs <> [a] <> drop i xs |
|||
randomIndex max = getStdRandom (randomR (1, max)) |
randomIndex max = getStdRandom (randomR (1, max)) |
||
randomDNA = head . randoms <$> newStdGen |
randomDNA = head . randoms <$> newStdGen |
||
mutate :: Int -> DNASequence -> IO DNASequence |
|||
mutate 0 s = pure s |
|||
mutate n s = do |
|||
(m, ms) <- mutateSequence s |
(m, ms) <- mutateSequence s |
||
uncurry (printf "%6s @ %d\n") m |
uncurry (printf "%6s @ %d\n") m |
||
mutate (pred n) ms |
|||
main :: IO () |
main :: IO () |
||
main = do |
main = do |
||
ds <- newSequence 200 |
|||
putStrLn "\nInitial Sequence:" >> showSequence |
putStrLn "\nInitial Sequence:" >> showSequence ds |
||
putStrLn "\nBase Counts:" >> showBaseCounts |
putStrLn "\nBase Counts:" >> showBaseCounts ds |
||
printf "Total: %d\n\n" $ length |
printf "Total: %d\n\n" $ length ds |
||
ms <- |
ms <- mutate 10 ds |
||
putStrLn "\nMutated Sequence:" >> showSequence ms |
putStrLn "\nMutated Sequence:" >> showSequence ms |
||
putStrLn "\nBase Counts:" >> showBaseCounts ms |
putStrLn "\nBase Counts:" >> showBaseCounts ms |