-- -- transform to and from dotbracket notation for RNA secondary structures. -- {-# LANGUAGE RecordWildCards #-} module Biobase.Structure.DotBracket where import Data.Array.IArray import Data.List (sort) import Biobase.RNA import Biobase.Structure -- | Given the secondary structure notation, generate the dot-bracket string. dotbracket :: Secondary -> String dotbracket Secondary{..} = elems rbr where arr = listArray (0,len-1) $ replicate len '.' :: Array Int Char lbr = arr // map (\(l,_) -> (l,'(')) pairings rbr = lbr // map (\(_,r) -> (r,')')) pairings -- | transforms a pseudoknot-free dotbracket string into a pairlist dotbracketToPairlist :: String -> Secondary dotbracketToPairlist str = Secondary (length str) (sort $ f 0 [] str) where f :: Int -> [Int] -> String -> [(Int,Int)] f _ st [] = [] f k st ('.':xs) = f (k+1) st xs f k st ('(':xs) = f (k+1) (k:st) xs f k (s:st) (')':xs) = (s,k) : f (k+1) st xs f a b c = error $ show (a,b,c)