samtools-conduit 0.1.0.1 → 0.1.1.0
raw patch · 2 files changed
+57/−2 lines, 2 filesdep ~basenew-component:exe:samtools-conduit-copy
Dependency ranges changed: base
Files
- samtools-conduit.cabal +13/−2
- test/SamtoolsConduitCopy.hs +44/−0
samtools-conduit.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: samtools-conduit-version: 0.1.0.1+version: 0.1.1.0 synopsis: Conduit interface to SAM/BAM format files through samtools description: Conduit interface to SAM/BAM format files through samtools homepage: http://www.ingolia-lab.org/samtools-tutorial.html@@ -18,6 +18,17 @@ library exposed-modules: Bio.SamTools.Conduit -- other-modules: - build-depends: base >= 4.6 && <5, bytestring >= 0.9, samtools >= 0.2.4.1, filepath,+ build-depends: base ==4.6.*, bytestring >= 0.9, samtools >= 0.2.4.1, filepath, transformers, resourcet, conduit >= 1.1 hs-source-dirs: src++flag Examples+ Description: Build example executables+ Default: False++executable samtools-conduit-copy+ main-is: SamtoolsConduitCopy.hs+ other-modules: Bio.SamTools.Conduit+ build-depends: base ==4.6.*, bytestring >= 0.9, samtools >= 0.2.4.1, filepath,+ transformers, resourcet, conduit >= 1.1+ hs-source-dirs: src, test
+ test/SamtoolsConduitCopy.hs view
@@ -0,0 +1,44 @@+{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}+module Main+ where++import Control.Monad.IO.Class+import Control.Monad.Trans.Resource+import qualified Data.ByteString.Char8 as BS+import qualified Data.Conduit as C+import qualified Data.Conduit.List as C+import Data.Maybe+import Numeric+import System.Environment+import System.FilePath+import System.IO++import qualified Bio.SamTools.Bam as Bam+import qualified Bio.SamTools.Conduit as Bam++main :: IO ()+main = getArgs >>= runWithArgs+ where runWithArgs [ inname ] = copy inname+ runWithArgs _ = do hPutStrLn stderr $ "Specify exactly one input BAM file"++copy :: FilePath -> IO ()+copy infile = do Bam.withBamInFile infile $ \hin ->+ Bam.withBamOutFile (outfile "-1") (Bam.inHeader hin) $ \hout ->+ runResourceT $ Bam.sourceHandle hin C.$$ Bam.sinkHandle hout+ runResourceT $ Bam.sourceBamInFile infile C.$= process C.$$ Bam.sinkBamOutFile (outfile "-2")+ runResourceT $ Bam.sourceBamInFile infile C.$= enumerate C.$$ Bam.sinkBamOutFile (outfile "-3")+ where outfile suffix = (takeBaseName infile) ++ suffix ++ (takeExtension infile)+ +process :: (MonadIO m) => C.Conduit Bam.Bam1 m Bam.Bam1+process = C.mapM procOne+ where procOne b0 = let qyseq = fromMaybe "" . Bam.querySeq $ b0+ nt = BS.foldl' (\n ch -> if ch == 'T' then n+1 else n) 0 qyseq+ nn = BS.length qyseq+ fstr = showFFloat (Just 3) ((fromIntegral nt / fromIntegral nn) :: Double) ""+ in liftIO (Bam.addAuxZ b0 "XX" fstr)++enumerate :: (MonadIO m) => C.Conduit Bam.Bam1 m Bam.Bam1+enumerate = C.mapAccumM procOne 0 >> return ()+ where procOne b0 i = do b' <- liftIO $! Bam.addAuxi b0 "XY" i+ return (i + 1, b')+