-------------------------------------------------------------------------------- -- | -- Module : $Header$ -- Copyright : (c) 2014 Kai Zhang -- License : MIT -- Maintainer : kai@kzhang.org -- Stability : experimental -- Portability : portable -- functions for processing BED files -------------------------------------------------------------------------------- module Bio.Data.Bam ( readBam , bamToBed , viewBam ) where import Bio.SamTools.Bam import Bio.SamTools.BamIndex import Control.Monad.Trans.Class (lift) import qualified Data.ByteString.Char8 as B import Conduit (Source, Conduit, yield, concatMapC) import Data.Maybe (fromJust) import Bio.Data.Bed readBam :: FilePath -> Source IO Bam1 readBam fl = do handle <- lift $ openBamInFile fl go handle where go h = do x <- lift $ get1 h case x of Nothing -> lift $ closeInHandle h Just bam -> yield bam >> go h {-# INLINE readBam #-} bamToBed :: Monad m => Conduit Bam1 m BED bamToBed = concatMapC f where f bam =case targetName bam of Just chr -> let start = fromIntegral . fromJust . position $ bam end = start + (fromIntegral . fromJust . queryLength) bam nm = Just . queryName $ bam strand = Just . not . isReverse $ bam in Just $ BED chr start end nm Nothing strand _ -> Nothing {-# INLINE bamToBed #-} viewBam :: IdxHandle -> (B.ByteString, Int, Int) -> Source IO Bam1 viewBam handle (chr, s, e) = case lookupTarget (idxHeader handle) chr of Nothing -> return () Just chrId -> do q <- lift $ query handle chrId (fromIntegral s,fromIntegral e) go q where go q' = do r <- lift $ next q' case r of Nothing -> return () Just bam -> yield bam >> go q' {-# INLINE viewBam #-}