module Biobase.FR3D where
import Data.ByteString.Char8 as BS
import Data.List as L
data FR3D = FR3D
{ pdbid :: ByteString
, chains :: [(ByteString,ByteString)]
, basepairs :: [Basepair]
} deriving (Show)
data Basepair = Basepair
{ interaction :: ByteString
, nucleotide1 :: Char
, pdbnumber1 :: Int
, chain1 :: ByteString
, seqpos1 :: Int
, nucleotide2 :: Char
, pdbnumber2 :: Int
, chain2 :: ByteString
, seqpos2 :: Int
} deriving (Show)
data LinFR3D = LinFR3D
{ pdbID :: ByteString
, sequence :: ByteString
, pairs :: [(Int,Int,String)]
} deriving (Show)
linearizeFR3D :: FR3D -> LinFR3D
linearizeFR3D FR3D{..} = LinFR3D
{ pdbID = pdbid
, sequence = BS.intercalate "&" $ L.map snd chains
, pairs = L.map f basepairs
} where
trans = snd $ L.mapAccumL ( \acc (x,y) -> (acc + 1 + BS.length y, (x,acc))
) 0 chains
f Basepair{..} = ( maybe (1) (\v -> v+seqpos1) $ L.lookup chain1 trans
, maybe (1) (\v -> v+seqpos2) $ L.lookup chain2 trans
, BS.unpack interaction
)