korfu-0.2: src/Korfu.hs
-- | New version, using BlastX results to determine ORFs
module Main where
import System.IO
import Blastx
import Options
import Bio.Sequence
import Bio.Alignment.BlastFlat
import Control.Monad (when)
import Data.Maybe
main :: IO ()
main = do
opts <- getOptions
ss <- map castToNuc `fmap` (readFasta $ fasta opts)
if gen_all opts
then do
case cds_out opts of
"" -> error "No output specified"
"-" -> hWriteFasta stdout $ concatMap all_frames ss
cf -> writeFasta cf $ concatMap all_frames ss
else do
bs <- readXML $ blastx opts
h <- case redir_out opts of
"" -> return Nothing
"-" -> return (Just stdout)
rf -> openFile rf WriteMode >>= \x -> return (Just x)
g <- case cds_out opts of
"" -> return Nothing
"-" -> return (Just stdout)
cf -> openFile cf WriteMode >>= \x -> return (Just x)
let my_process s = do
when (isJust h) $ process genFasta (fromJust h) s
when (isJust g) $ process genCDS (fromJust g) s
mapM_ my_process (frames ss bs)
when (isJust g) $ hClose (fromJust g)
when (isJust h) $ hClose (fromJust h)
all_frames :: Sequence Nuc -> [Sequence Amino]
all_frames s =
map (\i -> (Seq (fromStr (toStr (seqlabel s)++"_F+"++show i)) (toIUPAC $ translate s i) Nothing)) [0,1,2]
++ map (\i -> (Seq (fromStr (toStr (seqlabel s)++"_F-"++show i)) (toIUPAC $ translate (revcompl s) i) Nothing)) [0,1,2]
process :: (a -> [Sequence t]) -> Handle -> a -> IO ()
process fmt h = hWriteFasta h . fmt