packages feed

biohazard-0.6.1: tools/Xlate.hs

{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -Wall #-}
module Xlate where

import qualified Data.ByteString.Char8  as S
import qualified Data.IntMap            as I
import qualified Data.List              as L
import qualified Data.Map               as M

-- aligned sequences in, coodinate on first in, coordinate on second out
xpose :: S.ByteString -> S.ByteString -> Int -> Int
xpose ref smp = \p -> I.findWithDefault (-1) p mm
  where
    (!mm,_,_) = L.foldl' advance (I.empty, 0, 0) $ S.zip ref smp
    advance (!m,!p1,!p2) (r,s) = let !p1' = if r == '-' then p1 else 1+p1
                                     !p2' = if s == '-' then p2 else 1+p2
                                 in if r == '-' then (m,p1',p2')
                                    else (I.insert p1' p2' m, p1', p2')

-- diffz :: CDS -> [(String, Int, Char, Char)]
-- diffz cds@(CDS _ nm _) = [ (nm, i, r, b) | (i,r,b) <- zip3 [1..] aa_ref aa_bnt, r /= b ]
  -- where (aa_ref, aa_bnt) = get_protein cds

get_protein :: S.ByteString -> (Int,Int) -> String
get_protein ns (s,e) = translate $ cutout
  where
    cutout | s <= e = (take (e-s+1) $ drop (s-1) $ filter (/= '-') $ S.unpack ns) ++ "AA"
           | otherwise = (map compl $ reverse $
                          take (s-e+1) $ drop (e-1) $ filter (/= '-') $ S.unpack ns) ++ "AA"

    compl 'A' = 'T'
    compl 'C' = 'G'
    compl 'G' = 'C'
    compl 'T' = 'A'
    compl  x  =  x


translate :: String -> String
translate (a:b:c:s) = m : translate s
    where m = M.findWithDefault 'X' (a,b,c) mito_code
translate _ = []

standard_code :: M.Map (Char,Char,Char)  Char
standard_code = M.fromList $ zip3 base1 base2 base3 `zip` aas
  where
    aas   = "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG"
    base1 = "TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG"
    base2 = "TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG"
    base3 = "TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG"

mito_code :: M.Map (Char,Char,Char)  Char
mito_code = M.insert ('A','G','A') '*' $
            M.insert ('A','G','G') '*' $
            M.insert ('A','T','A') 'M' $
            M.insert ('T','G','A') 'W' $ standard_code