bioinformatics-toolkit 0.9.5 → 0.10.0
raw patch · 14 files changed
+224/−305 lines, 14 filesdep +deepseqdep ~aesondep ~attoparsecbinary-addedPVP ok
version bump matches the API change (PVP)
Dependencies added: deepseq
Dependency ranges changed: aeson, attoparsec
API changes (from Hackage documentation)
- Bio.Utils.Functions: kdeWeight :: Int -> Vector Double -> Vector Double
+ Bio.Data.Bed.Types: instance (Control.DeepSeq.NFData bed, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Bio.Data.Bed.Types.BEDExt bed a)
+ Bio.Data.Bed.Types: instance Control.DeepSeq.NFData Bio.Data.Bed.Types.BED
+ Bio.Data.Bed.Types: instance Control.DeepSeq.NFData Bio.Data.Bed.Types.BED3
+ Bio.Data.Bed.Types: instance Control.DeepSeq.NFData Bio.Data.Bed.Types.BEDGraph
+ Bio.Data.Bed.Types: instance Control.DeepSeq.NFData Bio.Data.Bed.Types.BroadPeak
+ Bio.Data.Bed.Types: instance Control.DeepSeq.NFData Bio.Data.Bed.Types.NarrowPeak
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic (Bio.Data.Bed.Types.BEDExt bed a)
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic Bio.Data.Bed.Types.BED
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic Bio.Data.Bed.Types.BED3
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic Bio.Data.Bed.Types.BEDGraph
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic Bio.Data.Bed.Types.BroadPeak
+ Bio.Data.Bed.Types: instance GHC.Generics.Generic Bio.Data.Bed.Types.NarrowPeak
+ Bio.Data.Bed.Utils: countTagsBed :: (PrimMonad m, BEDLike b, Vector v Int) => [b] -> ConduitT BED o m (v Int, Int)
+ Bio.Data.Fastq: instance Control.DeepSeq.NFData Bio.Data.Fastq.Fastq
+ Bio.Data.Fastq: instance GHC.Generics.Generic Bio.Data.Fastq.Fastq
+ Bio.Data.Fastq: parseFastqC' :: MonadThrow m => ConduitT ByteString Fastq m ()
+ Bio.Utils.Functions: gaussianKDE :: Int -> Vector Double -> Double -> Double
- Bio.Data.Bed: BED :: !ByteString -> !Int -> !Int -> !Maybe ByteString -> !Maybe Int -> !Maybe Bool -> BED
+ Bio.Data.Bed: BED :: ByteString -> Int -> Int -> Maybe ByteString -> Maybe Int -> Maybe Bool -> BED
- Bio.Data.Bed: BED3 :: !ByteString -> !Int -> !Int -> BED3
+ Bio.Data.Bed: BED3 :: ByteString -> Int -> Int -> BED3
- Bio.Data.Bed: BEDGraph :: !ByteString -> !Int -> !Int -> !Double -> BEDGraph
+ Bio.Data.Bed: BEDGraph :: ByteString -> Int -> Int -> Double -> BEDGraph
- Bio.Data.Bed: NarrowPeak :: !ByteString -> !Int -> !Int -> !Maybe ByteString -> !Int -> !Maybe Bool -> !Double -> !Maybe Double -> !Maybe Double -> !Maybe Int -> NarrowPeak
+ Bio.Data.Bed: NarrowPeak :: ByteString -> Int -> Int -> Maybe ByteString -> Int -> Maybe Bool -> Double -> Maybe Double -> Maybe Double -> Maybe Int -> NarrowPeak
- Bio.Data.Bed: [_bdg_chrom] :: BEDGraph -> !ByteString
+ Bio.Data.Bed: [_bdg_chrom] :: BEDGraph -> ByteString
- Bio.Data.Bed: [_bdg_chrom_end] :: BEDGraph -> !Int
+ Bio.Data.Bed: [_bdg_chrom_end] :: BEDGraph -> Int
- Bio.Data.Bed: [_bdg_chrom_start] :: BEDGraph -> !Int
+ Bio.Data.Bed: [_bdg_chrom_start] :: BEDGraph -> Int
- Bio.Data.Bed: [_bdg_value] :: BEDGraph -> !Double
+ Bio.Data.Bed: [_bdg_value] :: BEDGraph -> Double
- Bio.Data.Bed: [_bed3_chrom] :: BED3 -> !ByteString
+ Bio.Data.Bed: [_bed3_chrom] :: BED3 -> ByteString
- Bio.Data.Bed: [_bed3_chrom_end] :: BED3 -> !Int
+ Bio.Data.Bed: [_bed3_chrom_end] :: BED3 -> Int
- Bio.Data.Bed: [_bed3_chrom_start] :: BED3 -> !Int
+ Bio.Data.Bed: [_bed3_chrom_start] :: BED3 -> Int
- Bio.Data.Bed: [_bed_chromEnd] :: BED -> !Int
+ Bio.Data.Bed: [_bed_chromEnd] :: BED -> Int
- Bio.Data.Bed: [_bed_chromStart] :: BED -> !Int
+ Bio.Data.Bed: [_bed_chromStart] :: BED -> Int
- Bio.Data.Bed: [_bed_chrom] :: BED -> !ByteString
+ Bio.Data.Bed: [_bed_chrom] :: BED -> ByteString
- Bio.Data.Bed: [_bed_name] :: BED -> !Maybe ByteString
+ Bio.Data.Bed: [_bed_name] :: BED -> Maybe ByteString
- Bio.Data.Bed: [_bed_score] :: BED -> !Maybe Int
+ Bio.Data.Bed: [_bed_score] :: BED -> Maybe Int
- Bio.Data.Bed: [_bed_strand] :: BED -> !Maybe Bool
+ Bio.Data.Bed: [_bed_strand] :: BED -> Maybe Bool
- Bio.Data.Bed: [_npChrom] :: NarrowPeak -> !ByteString
+ Bio.Data.Bed: [_npChrom] :: NarrowPeak -> ByteString
- Bio.Data.Bed: [_npEnd] :: NarrowPeak -> !Int
+ Bio.Data.Bed: [_npEnd] :: NarrowPeak -> Int
- Bio.Data.Bed: [_npName] :: NarrowPeak -> !Maybe ByteString
+ Bio.Data.Bed: [_npName] :: NarrowPeak -> Maybe ByteString
- Bio.Data.Bed: [_npPeak] :: NarrowPeak -> !Maybe Int
+ Bio.Data.Bed: [_npPeak] :: NarrowPeak -> Maybe Int
- Bio.Data.Bed: [_npPvalue] :: NarrowPeak -> !Maybe Double
+ Bio.Data.Bed: [_npPvalue] :: NarrowPeak -> Maybe Double
- Bio.Data.Bed: [_npQvalue] :: NarrowPeak -> !Maybe Double
+ Bio.Data.Bed: [_npQvalue] :: NarrowPeak -> Maybe Double
- Bio.Data.Bed: [_npScore] :: NarrowPeak -> !Int
+ Bio.Data.Bed: [_npScore] :: NarrowPeak -> Int
- Bio.Data.Bed: [_npSignal] :: NarrowPeak -> !Double
+ Bio.Data.Bed: [_npSignal] :: NarrowPeak -> Double
- Bio.Data.Bed: [_npStart] :: NarrowPeak -> !Int
+ Bio.Data.Bed: [_npStart] :: NarrowPeak -> Int
- Bio.Data.Bed: [_npStrand] :: NarrowPeak -> !Maybe Bool
+ Bio.Data.Bed: [_npStrand] :: NarrowPeak -> Maybe Bool
- Bio.Data.Bed: _bed :: forall bed_apng a_apnh bed_apzF. Lens (BEDExt bed_apng a_apnh) (BEDExt bed_apzF a_apnh) bed_apng bed_apzF
+ Bio.Data.Bed: _bed :: forall bed_aqwr a_aqws bed_aqS1. Lens (BEDExt bed_aqwr a_aqws) (BEDExt bed_aqS1 a_aqws) bed_aqwr bed_aqS1
- Bio.Data.Bed: _data :: forall bed_apng a_apnh a_apzG. Lens (BEDExt bed_apng a_apnh) (BEDExt bed_apng a_apzG) a_apnh a_apzG
+ Bio.Data.Bed: _data :: forall bed_aqwr a_aqws a_aqS2. Lens (BEDExt bed_aqwr a_aqws) (BEDExt bed_aqwr a_aqS2) a_aqws a_aqS2
- Bio.Data.Bed.Types: BED :: !ByteString -> !Int -> !Int -> !Maybe ByteString -> !Maybe Int -> !Maybe Bool -> BED
+ Bio.Data.Bed.Types: BED :: ByteString -> Int -> Int -> Maybe ByteString -> Maybe Int -> Maybe Bool -> BED
- Bio.Data.Bed.Types: BED3 :: !ByteString -> !Int -> !Int -> BED3
+ Bio.Data.Bed.Types: BED3 :: ByteString -> Int -> Int -> BED3
- Bio.Data.Bed.Types: BEDGraph :: !ByteString -> !Int -> !Int -> !Double -> BEDGraph
+ Bio.Data.Bed.Types: BEDGraph :: ByteString -> Int -> Int -> Double -> BEDGraph
- Bio.Data.Bed.Types: BroadPeak :: !ByteString -> !Int -> !Int -> !Maybe ByteString -> !Int -> !Maybe Bool -> !Double -> !Maybe Double -> !Maybe Double -> BroadPeak
+ Bio.Data.Bed.Types: BroadPeak :: ByteString -> Int -> Int -> Maybe ByteString -> Int -> Maybe Bool -> Double -> Maybe Double -> Maybe Double -> BroadPeak
- Bio.Data.Bed.Types: NarrowPeak :: !ByteString -> !Int -> !Int -> !Maybe ByteString -> !Int -> !Maybe Bool -> !Double -> !Maybe Double -> !Maybe Double -> !Maybe Int -> NarrowPeak
+ Bio.Data.Bed.Types: NarrowPeak :: ByteString -> Int -> Int -> Maybe ByteString -> Int -> Maybe Bool -> Double -> Maybe Double -> Maybe Double -> Maybe Int -> NarrowPeak
- Bio.Data.Bed.Types: [_bdg_chrom] :: BEDGraph -> !ByteString
+ Bio.Data.Bed.Types: [_bdg_chrom] :: BEDGraph -> ByteString
- Bio.Data.Bed.Types: [_bdg_chrom_end] :: BEDGraph -> !Int
+ Bio.Data.Bed.Types: [_bdg_chrom_end] :: BEDGraph -> Int
- Bio.Data.Bed.Types: [_bdg_chrom_start] :: BEDGraph -> !Int
+ Bio.Data.Bed.Types: [_bdg_chrom_start] :: BEDGraph -> Int
- Bio.Data.Bed.Types: [_bdg_value] :: BEDGraph -> !Double
+ Bio.Data.Bed.Types: [_bdg_value] :: BEDGraph -> Double
- Bio.Data.Bed.Types: [_bed3_chrom] :: BED3 -> !ByteString
+ Bio.Data.Bed.Types: [_bed3_chrom] :: BED3 -> ByteString
- Bio.Data.Bed.Types: [_bed3_chrom_end] :: BED3 -> !Int
+ Bio.Data.Bed.Types: [_bed3_chrom_end] :: BED3 -> Int
- Bio.Data.Bed.Types: [_bed3_chrom_start] :: BED3 -> !Int
+ Bio.Data.Bed.Types: [_bed3_chrom_start] :: BED3 -> Int
- Bio.Data.Bed.Types: [_bed_chromEnd] :: BED -> !Int
+ Bio.Data.Bed.Types: [_bed_chromEnd] :: BED -> Int
- Bio.Data.Bed.Types: [_bed_chromStart] :: BED -> !Int
+ Bio.Data.Bed.Types: [_bed_chromStart] :: BED -> Int
- Bio.Data.Bed.Types: [_bed_chrom] :: BED -> !ByteString
+ Bio.Data.Bed.Types: [_bed_chrom] :: BED -> ByteString
- Bio.Data.Bed.Types: [_bed_name] :: BED -> !Maybe ByteString
+ Bio.Data.Bed.Types: [_bed_name] :: BED -> Maybe ByteString
- Bio.Data.Bed.Types: [_bed_score] :: BED -> !Maybe Int
+ Bio.Data.Bed.Types: [_bed_score] :: BED -> Maybe Int
- Bio.Data.Bed.Types: [_bed_strand] :: BED -> !Maybe Bool
+ Bio.Data.Bed.Types: [_bed_strand] :: BED -> Maybe Bool
- Bio.Data.Bed.Types: [_bpChrom] :: BroadPeak -> !ByteString
+ Bio.Data.Bed.Types: [_bpChrom] :: BroadPeak -> ByteString
- Bio.Data.Bed.Types: [_bpEnd] :: BroadPeak -> !Int
+ Bio.Data.Bed.Types: [_bpEnd] :: BroadPeak -> Int
- Bio.Data.Bed.Types: [_bpName] :: BroadPeak -> !Maybe ByteString
+ Bio.Data.Bed.Types: [_bpName] :: BroadPeak -> Maybe ByteString
- Bio.Data.Bed.Types: [_bpPvalue] :: BroadPeak -> !Maybe Double
+ Bio.Data.Bed.Types: [_bpPvalue] :: BroadPeak -> Maybe Double
- Bio.Data.Bed.Types: [_bpQvalue] :: BroadPeak -> !Maybe Double
+ Bio.Data.Bed.Types: [_bpQvalue] :: BroadPeak -> Maybe Double
- Bio.Data.Bed.Types: [_bpScore] :: BroadPeak -> !Int
+ Bio.Data.Bed.Types: [_bpScore] :: BroadPeak -> Int
- Bio.Data.Bed.Types: [_bpSignal] :: BroadPeak -> !Double
+ Bio.Data.Bed.Types: [_bpSignal] :: BroadPeak -> Double
- Bio.Data.Bed.Types: [_bpStart] :: BroadPeak -> !Int
+ Bio.Data.Bed.Types: [_bpStart] :: BroadPeak -> Int
- Bio.Data.Bed.Types: [_bpStrand] :: BroadPeak -> !Maybe Bool
+ Bio.Data.Bed.Types: [_bpStrand] :: BroadPeak -> Maybe Bool
- Bio.Data.Bed.Types: [_npChrom] :: NarrowPeak -> !ByteString
+ Bio.Data.Bed.Types: [_npChrom] :: NarrowPeak -> ByteString
- Bio.Data.Bed.Types: [_npEnd] :: NarrowPeak -> !Int
+ Bio.Data.Bed.Types: [_npEnd] :: NarrowPeak -> Int
- Bio.Data.Bed.Types: [_npName] :: NarrowPeak -> !Maybe ByteString
+ Bio.Data.Bed.Types: [_npName] :: NarrowPeak -> Maybe ByteString
- Bio.Data.Bed.Types: [_npPeak] :: NarrowPeak -> !Maybe Int
+ Bio.Data.Bed.Types: [_npPeak] :: NarrowPeak -> Maybe Int
- Bio.Data.Bed.Types: [_npPvalue] :: NarrowPeak -> !Maybe Double
+ Bio.Data.Bed.Types: [_npPvalue] :: NarrowPeak -> Maybe Double
- Bio.Data.Bed.Types: [_npQvalue] :: NarrowPeak -> !Maybe Double
+ Bio.Data.Bed.Types: [_npQvalue] :: NarrowPeak -> Maybe Double
- Bio.Data.Bed.Types: [_npScore] :: NarrowPeak -> !Int
+ Bio.Data.Bed.Types: [_npScore] :: NarrowPeak -> Int
- Bio.Data.Bed.Types: [_npSignal] :: NarrowPeak -> !Double
+ Bio.Data.Bed.Types: [_npSignal] :: NarrowPeak -> Double
- Bio.Data.Bed.Types: [_npStart] :: NarrowPeak -> !Int
+ Bio.Data.Bed.Types: [_npStart] :: NarrowPeak -> Int
- Bio.Data.Bed.Types: [_npStrand] :: NarrowPeak -> !Maybe Bool
+ Bio.Data.Bed.Types: [_npStrand] :: NarrowPeak -> Maybe Bool
- Bio.Data.Bed.Types: _bed :: forall bed_apng a_apnh bed_apzF. Lens (BEDExt bed_apng a_apnh) (BEDExt bed_apzF a_apnh) bed_apng bed_apzF
+ Bio.Data.Bed.Types: _bed :: forall bed_aqwr a_aqws bed_aqS1. Lens (BEDExt bed_aqwr a_aqws) (BEDExt bed_aqS1 a_aqws) bed_aqwr bed_aqS1
- Bio.Data.Bed.Types: _data :: forall bed_apng a_apnh a_apzG. Lens (BEDExt bed_apng a_apnh) (BEDExt bed_apng a_apzG) a_apnh a_apzG
+ Bio.Data.Bed.Types: _data :: forall bed_aqwr a_aqws a_aqS2. Lens (BEDExt bed_aqwr a_aqws) (BEDExt bed_aqwr a_aqS2) a_aqws a_aqS2
- Bio.Data.Fastq: parseFastqC :: MonadThrow m => ConduitT ByteString Fastq m ()
+ Bio.Data.Fastq: parseFastqC :: Monad m => ConduitT ByteString Fastq m ()
Files
- benchmarks/bench.hs +19/−10
- bioinformatics-toolkit.cabal +8/−5
- src/Bio/Data/Bam.hs +0/−1
- src/Bio/Data/Bed/Types.hs +43/−39
- src/Bio/Data/Bed/Utils.hs +28/−6
- src/Bio/Data/Fastq.hs +92/−20
- src/Bio/GO.hs +0/−2
- src/Bio/RealWorld/ENCODE.hs +4/−2
- src/Bio/RealWorld/Ensembl.hs +1/−1
- src/Bio/Utils/Functions.hs +12/−12
- tests/Tests/Fastq.hs +17/−7
- tests/data/test.fastq +0/−200
- tests/data/test.fastq.gz binary
- tests/data/test_wrap.fastq.gz binary
benchmarks/bench.hs view
@@ -2,22 +2,24 @@ import Criterion.Main import System.Random+import Data.Conduit.Zlib (ungzip, multiple, gzip) import qualified Data.ByteString.Char8 as B import Data.Default.Class-import qualified Data.Conduit.List as CL-import Data.Conduit+import Conduit import Control.Monad.Identity import System.IO.Unsafe import AI.Clustering.Hierarchical+import Data.Either import Bio.Data.Fasta+import Bio.Data.Fastq import Bio.Motif import Bio.Motif.Search import Bio.Motif.Alignment import Bio.Seq dna :: DNA Basic-dna = fromBS $ B.pack $ map f $ take 5000 $ randomRs (0, 3) (mkStdGen 2)+dna = fromRight undefined $ fromBS $ B.pack $ map f $ take 5000 $ randomRs (0, 3) (mkStdGen 2) where f :: Int -> Char f x = case x of@@ -44,10 +46,17 @@ motifs = unsafePerformIO $ readFasta' "data/motifs.fasta" main :: IO ()-main = defaultMain - [ bench "motif score" $ nf (scores def pwm) dna - , bgroup "TFBS scanning" [ bench "Naive" $ nf (\x -> runIdentity $ findTFBSSlow def pwm x (0.6 * optimalScore def pwm) $$ CL.consume) dna- , bench "look ahead" $ nf (\x -> runIdentity $ findTFBS def pwm x (0.6 * optimalScore def pwm) $$ CL.consume) dna- ]- , bench "motif merge" $ nf (\x -> fmap show $ flatten $ buildTree x) motifs- ]+main = do+ content <- fmap B.concat $ runResourceT $ runConduit $+ sourceFile "tests/data/test.fastq.gz" .| multiple ungzip .| sinkList+ let fq = B.concat $ replicate 50 content+ defaultMain + [ bench "motif score" $ nf (scores def pwm) dna + --, bgroup "TFBS scanning" [ bench "Naive" $ nf (\x -> runIdentity $ findTFBSSlow def pwm x (0.6 * optimalScore def pwm) $$ CL.consume) dna+ -- , bench "look ahead" $ nf (\x -> runIdentity $ findTFBS def pwm x (0.6 * optimalScore def pwm) $$ CL.consume) dna+ -- ]+ --, bench "motif merge" $ nf (\x -> fmap show $ flatten $ buildTree x) motifs+ , bench "Read FASTQ Fast" $ nfAppIO (\x -> runConduit $ yield x .| parseFastqC .| sinkList) fq+ , bench "Read FASTQ Slow" $ nfAppIO (\x -> runConduit $ yield x .| parseFastqC' .| sinkList) fq+ ]+
bioinformatics-toolkit.cabal view
@@ -1,5 +1,5 @@ name: bioinformatics-toolkit-version: 0.9.5+version: 0.10.0 synopsis: A collection of bioinformatics tools description: A collection of bioinformatics tools license: MIT@@ -10,7 +10,7 @@ category: Bio build-type: Simple extra-source-files: README.md-cabal-version: >=1.18+cabal-version: 1.18 data-files: tests/data/example.bam tests/data/example.bed.gz@@ -21,7 +21,8 @@ tests/data/example_intersect_peaks.bed.gz tests/data/motifs.fasta tests/data/motifs.meme- tests/data/test.fastq+ tests/data/test.fastq.gz+ tests/data/test_wrap.fastq.gz tests/data/genes.gtf.gz library@@ -60,9 +61,9 @@ build-depends: base >=4.11 && <5.0- , aeson+ , aeson >= 2.0 , aeson-pretty- , attoparsec+ , attoparsec >= 0.13.0.0 , bytestring >= 0.10 , bytestring-lexing >= 0.5 , case-insensitive@@ -73,6 +74,7 @@ , data-ordlist , data-default-class , double-conversion+ , deepseq , HsHTSLib >= 1.9.2 , http-conduit >= 2.1.8 , hexpat@@ -108,6 +110,7 @@ , bytestring , data-default-class , conduit+ , conduit-extra , mtl test-suite tests
src/Bio/Data/Bam.hs view
@@ -17,7 +17,6 @@ import Control.Monad (mzero) import Data.List (foldl') import Bio.Data.Bed-import Bio.Data.Bed.Types import Bio.Data.Fastq import Bio.HTS import Conduit
src/Bio/Data/Bed/Types.hs view
@@ -1,5 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE StrictData #-}+{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} module Bio.Data.Bed.Types ( BEDLike(..)@@ -32,6 +34,8 @@ import qualified Data.HashMap.Strict as M import qualified Data.IntervalMap.Strict as IM import Data.Maybe (fromJust, fromMaybe)+import GHC.Generics (Generic)+import Control.DeepSeq (NFData) import Bio.Utils.Misc (readDouble, readInt) @@ -87,13 +91,13 @@ -- | BED6 format, as described in http://genome.ucsc.edu/FAQ/FAQformat.html#format1.7 data BED = BED- { _bed_chrom :: !B.ByteString- , _bed_chromStart :: !Int- , _bed_chromEnd :: !Int- , _bed_name :: !(Maybe B.ByteString)- , _bed_score :: !(Maybe Int)- , _bed_strand :: !(Maybe Bool) -- ^ True: "+", False: "-"- } deriving (Eq, Show, Read)+ { _bed_chrom :: B.ByteString+ , _bed_chromStart :: Int+ , _bed_chromEnd :: Int+ , _bed_name :: Maybe B.ByteString+ , _bed_score :: Maybe Int+ , _bed_strand :: Maybe Bool -- ^ True: "+", False: "-"+ } deriving (Eq, Show, Read, Generic, NFData) instance Ord BED where compare (BED x1 x2 x3 x4 x5 x6) (BED y1 y2 y3 y4 y5 y6) =@@ -149,10 +153,10 @@ -- | BED3 format data BED3 = BED3- { _bed3_chrom :: !B.ByteString- , _bed3_chrom_start :: !Int- , _bed3_chrom_end :: !Int- } deriving (Eq, Show, Read)+ { _bed3_chrom :: B.ByteString+ , _bed3_chrom_start :: Int+ , _bed3_chrom_end :: Int+ } deriving (Eq, Show, Read, Generic, NFData) instance Ord BED3 where compare (BED3 x1 x2 x3) (BED3 y1 y2 y3) = compare (x1,x2,x3) (y1,y2,y3)@@ -179,11 +183,11 @@ -- | Bedgraph format. data BEDGraph = BEDGraph- { _bdg_chrom :: !B.ByteString- , _bdg_chrom_start :: !Int- , _bdg_chrom_end :: !Int- , _bdg_value :: !Double- } deriving (Eq, Show, Read)+ { _bdg_chrom :: B.ByteString+ , _bdg_chrom_start :: Int+ , _bdg_chrom_end :: Int+ , _bdg_value :: Double+ } deriving (Eq, Show, Read, Generic, NFData) makeLensesFor [("_bdg_value", "bdgValue")] ''BEDGraph @@ -215,17 +219,17 @@ -- | ENCODE narrowPeak format: https://genome.ucsc.edu/FAQ/FAQformat.html#format12 data NarrowPeak = NarrowPeak- { _npChrom :: !B.ByteString- , _npStart :: !Int- , _npEnd :: !Int- , _npName :: !(Maybe B.ByteString)- , _npScore :: !Int- , _npStrand :: !(Maybe Bool)- , _npSignal :: !Double- , _npPvalue :: !(Maybe Double)- , _npQvalue :: !(Maybe Double)- , _npPeak :: !(Maybe Int)- } deriving (Eq, Show, Read)+ { _npChrom :: B.ByteString+ , _npStart :: Int+ , _npEnd :: Int+ , _npName :: Maybe B.ByteString+ , _npScore :: Int+ , _npStrand :: Maybe Bool+ , _npSignal :: Double+ , _npPvalue :: Maybe Double+ , _npQvalue :: Maybe Double+ , _npPeak :: Maybe Int+ } deriving (Eq, Show, Read, Generic, NFData) makeLensesFor [ ("_npSignal", "npSignal") , ("_npPvalue", "npPvalue")@@ -276,16 +280,16 @@ -- | ENCODE broadPeak format: https://genome.ucsc.edu/FAQ/FAQformat.html#format13 data BroadPeak = BroadPeak- { _bpChrom :: !B.ByteString- , _bpStart :: !Int- , _bpEnd :: !Int- , _bpName :: !(Maybe B.ByteString)- , _bpScore :: !Int- , _bpStrand :: !(Maybe Bool)- , _bpSignal :: !Double- , _bpPvalue :: !(Maybe Double)- , _bpQvalue :: !(Maybe Double)- } deriving (Eq, Show, Read)+ { _bpChrom :: B.ByteString+ , _bpStart :: Int+ , _bpEnd :: Int+ , _bpName :: Maybe B.ByteString+ , _bpScore :: Int+ , _bpStrand :: Maybe Bool+ , _bpSignal :: Double+ , _bpPvalue :: Maybe Double+ , _bpQvalue :: Maybe Double+ } deriving (Eq, Show, Read, Generic, NFData) makeLensesFor [ ("_bpSignal", "bpSignal") , ("_bpPvalue", "bpPvalue")@@ -333,7 +337,7 @@ data BEDExt bed a = BEDExt { _ext_bed :: bed , _ext_data :: a- } deriving (Eq, Show, Read)+ } deriving (Eq, Show, Read, Generic, NFData) makeLensesFor [("_ext_bed", "_bed"), ("_ext_data", "_data")] ''BEDExt @@ -346,7 +350,7 @@ strand = _bed . strand instance (Read a, Show a, BEDConvert bed) => BEDConvert (BEDExt bed a) where- asBed chr s e = BEDExt (asBed chr s e) $ error "data not available"+ asBed _ _ _ = error "Unable to transform arbitrary record to BEDExt" fromLine l = let (a, b) = B.breakEnd (=='\t') l in BEDExt (fromLine $ B.init a) $ read $ B.unpack b
src/Bio/Data/Bed/Utils.hs view
@@ -16,6 +16,7 @@ , queryBaseMap , rpkmBed , rpkmSortedBed+ , countTagsBed , countTagsBinBed , countTagsBinBed' , tagCountDistr@@ -176,11 +177,11 @@ V.unsafeFreeze v' let (idx, sortedRegions) = V.unzip v n = G.length idx- rc <- rpkmSortedBed $ Sorted sortedRegions+ readCount <- rpkmSortedBed $ Sorted sortedRegions lift $ do result <- GM.new n- G.sequence_ . G.imap (\x i -> GM.unsafeWrite result i (rc U.! x)) $ idx+ G.sequence_ . G.imap (\x i -> GM.unsafeWrite result i (readCount U.! x)) $ idx G.unsafeFreeze result {-# INLINE rpkmBed #-} @@ -210,6 +211,27 @@ l = G.length regions {-# INLINE rpkmSortedBed #-} +countTagsBed :: (PrimMonad m, BEDLike b, G.Vector v Int)+ => [b] -> ConduitT BED o m (v Int, Int)+countTagsBed regions = do+ vec <- lift $ GM.replicate l 0+ n <- foldMC (count vec) (0 :: Int)+ vec' <- lift $ G.unsafeFreeze vec+ return (vec', n)+ where+ count v nTags tag = do+ let p | tag^.strand == Just True = tag^.chromStart+ | tag^.strand == Just False = tag^.chromEnd - 1+ | otherwise = error "Unkown strand"+ xs = concat $ IM.elems $+ IM.containing (M.lookupDefault IM.empty (tag^.chrom) intervalMap) p+ addOne v xs+ return $ succ nTags+ intervalMap = bedToTree (++) $ zip regions $ map return [0..]+ addOne v' = mapM_ $ \x -> GM.unsafeRead v' x >>= GM.unsafeWrite v' x . (+1)+ l = length regions+{-# INLINE countTagsBed #-}+ -- | divide each region into consecutive bins, and count tags for each bin and -- return the number of all tags. Note: a tag is considered to be overlapped -- with a region only if the starting position of the tag is in the region. For@@ -226,8 +248,8 @@ v <- GM.replicate num 0 return (v, index) nTags <- foldMC (f vs) 0- rc <- lift $ mapM (G.unsafeFreeze . fst) $ G.toList vs- return (rc, nTags)+ readCount <- lift $ mapM (G.unsafeFreeze . fst) $ G.toList vs+ return (readCount, nTags) where f vs n bed = do let pos | bed^.strand == Just True = bed^.chromStart@@ -282,8 +304,8 @@ GM.unsafeRead v i >>= GM.unsafeWrite v i . (+1) sink (nTags+1) vs - _ -> do rc <- lift $ mapM (G.unsafeFreeze . fst) $ G.toList vs- return (rc, nTags)+ _ -> do readCount <- lift $ mapM (G.unsafeFreeze . fst) $ G.toList vs+ return (readCount, nTags) intervalMap = bedToTree (++) $ zip beds $ map return [0..] {-# INLINE countTagsBinBed' #-}
src/Bio/Data/Fastq.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} module Bio.Data.Fastq ( Fastq(..) , streamFastqGzip@@ -7,6 +8,7 @@ , sinkFastqGzip , sinkFastq , parseFastqC+ , parseFastqC' , fastqToByteString , qualitySummary , trimPolyA@@ -19,6 +21,8 @@ import qualified Data.Attoparsec.ByteString as A import Data.Attoparsec.ByteString.Char8 import Data.Conduit.Attoparsec+import GHC.Generics (Generic)+import Control.DeepSeq -- | A FASTQ file normally uses four lines per sequence. --@@ -36,7 +40,7 @@ { fastqSeqId :: B.ByteString , fastqSeq :: B.ByteString , fastqSeqQual :: B.ByteString- } deriving (Show, Eq)+ } deriving (Show, Eq, Generic, NFData) -- | Read gzipped fastq file. streamFastqGzip :: (PrimMonad m, MonadThrow m, MonadResource m) @@ -55,29 +59,97 @@ => FilePath -> ConduitT Fastq o m () sinkFastqGzip fl = mapC fastqToByteString .| unlinesAsciiC .| gzip .| sinkFileBS fl -parseFastqC :: MonadThrow m => ConduitT B.ByteString Fastq m ()-parseFastqC = conduitParser fastqParser .| mapC snd+data FQBuilder = Init FQBuilder+ | FQ1 B.ByteString FQBuilder+ | FQ2 B.ByteString FQBuilder+ | FQ3 B.ByteString FQBuilder+ | Complete++fqBuilder :: FQBuilder -> Fastq+fqBuilder = go ([], [], [])+ where+ go acc (Init bldr) = go acc bldr+ go (f1,f2,f3) (FQ1 x bldr) = go (x:f1, f2, f3) bldr+ go (f1,f2,f3) (FQ2 x bldr) = go (f1, x:f2, f3) bldr+ go (f1,f2,f3) (FQ3 x bldr) = go (f1, f2, x:f3) bldr+ go (f1,f2,f3) Complete = Fastq (B.concat $ reverse f1)+ (B.concat $ reverse f2) (B.concat $ reverse f3)+{-# INLINE fqBuilder #-}++parseFastqC :: Monad m => ConduitT B.ByteString Fastq m ()+parseFastqC = await >>= maybe (error "Empty input") ( \x -> do+ if B.head x == '@'+ then loop Init 'a' $ B.tail x+ else error "Record does not start with \'@\'" )+ where+ tryRead1 input | B.null input = await >>= maybe (error "Unexpected EOF") return+ | otherwise = return input+ loop acc st input = case st of+ 'a' -> do+ (x, rest) <- B.break (=='\n') <$> tryRead1 input+ if B.null rest+ then loop (acc . FQ1 x) 'a' rest+ else loop (acc . FQ1 x) 'b' $ B.tail rest+ 'b' -> do + (x, rest) <- B.break (=='\n') <$> tryRead1 input+ if B.null rest+ then loop (acc . FQ2 x) 'b' rest+ else loop (acc . FQ2 x) 'B' $ B.tail rest+ 'B' -> do + input' <- tryRead1 input+ if B.head input' == '+'+ then loop acc 'c' $ B.tail input'+ else do+ let (x, rest) = B.break (=='\n') input'+ if B.null rest+ then loop (acc . FQ2 x) 'b' rest+ else loop (acc . FQ2 x) 'B' $ B.tail rest+ 'c' -> do+ (x, rest) <- B.break (=='\n') <$> tryRead1 input+ if B.null rest+ then loop acc 'c' rest+ else loop acc 'd' $ B.tail rest+ 'd' -> do+ (x, rest) <- B.break (=='\n') <$> tryRead1 input+ if B.null rest + then loop (acc . FQ3 x) 'd' rest+ else loop (acc . FQ3 x) 'D' $ B.tail rest+ 'D' -> if B.null input+ then await >>= \case+ Nothing -> yield $ fqBuilder $ acc Complete+ Just input' -> if B.head input' == '@'+ then do+ yield $ fqBuilder $ acc Complete+ loop Init 'a' $ B.tail input'+ else loop acc 'd' input'+ else if B.head input == '@'+ then do+ yield $ fqBuilder $ acc Complete+ loop Init 'a' $ B.tail input+ else loop acc 'd' input {-# INLINE parseFastqC #-} -fastqParser :: Parser Fastq-fastqParser = do- _ <- skipWhile (/='@') >> char8 '@'- ident <- A.takeTill isEndOfLine- endOfLine- sequ <- BS.filter (not . isEndOfLine) <$> takeTill (=='+')- char8 '+' >> A.skipWhile (not . isEndOfLine) >> endOfLine- score <- BS.filter (not . isEndOfLine) <$>- A.scan 0 (f (B.length sequ))- skipWhile (/='@')- return $ Fastq ident sequ score+parseFastqC' :: MonadThrow m => ConduitT B.ByteString Fastq m ()+parseFastqC' = conduitParser fastqParser .| mapC snd where- f n i x | i >= n = Nothing- | isEndOfLine x = Just i- | otherwise = Just $ i + 1-{-# INLINE fastqParser #-}+ fastqParser = do+ _ <- skipWhile (/='@') >> char8 '@'+ ident <- A.takeTill isEndOfLine+ endOfLine+ sequ <- BS.filter (not . isEndOfLine) <$> takeTill (=='+')+ char8 '+' >> A.skipWhile (not . isEndOfLine) >> endOfLine+ score <- BS.filter (not . isEndOfLine) <$>+ A.scan 0 (f (B.length sequ))+ skipWhile (/='@')+ return $ Fastq ident sequ score+ where+ f n i x | i >= n = Nothing+ | isEndOfLine x = Just i+ | otherwise = Just $ i + 1+{-# INLINE parseFastqC' #-} fastqToByteString :: Fastq -> B.ByteString-fastqToByteString (Fastq a b c) = "@" <> a <> "\n" <> b <> "\n+\n" <> c+fastqToByteString (Fastq a b c) = B.concat ["@", a, "\n", b, "\n+\n", c] {-# INLINE fastqToByteString #-} -- | Get the mean and variance of quality scores at every position.@@ -87,7 +159,7 @@ meanVarianceC :: Monad m => ConduitT [Double] o m [(Double, Double)] meanVarianceC = peekC >>= \case Nothing -> error "Empty input"- Just x -> fst <$> foldlC f (replicate (length x) (0,0), 0)+ Just x -> fst <$> foldlC f (replicate (length x) (0,0), 0 :: Int) where f (acc, n) xs = let acc' = zipWith g acc xs in (acc', n') where
src/Bio/GO.hs view
@@ -21,8 +21,6 @@ type GOMap = M.HashMap GOId GO -type TermCount = M.HashMap GOId Int- -- | The top level is 0. getGOLevel :: GOId -> GOMap -> Int getGOLevel gid gm = loop 0 [gid]
src/Bio/RealWorld/ENCODE.hs view
@@ -29,12 +29,14 @@ import Data.Aeson import Data.Aeson.Types import Data.Aeson.Encode.Pretty (encodePretty)-import qualified Data.HashMap.Lazy as M+import qualified Data.Aeson.KeyMap as M+import qualified Data.Aeson.Key as M import qualified Data.ByteString.Lazy.Char8 as B import qualified Data.ByteString.Char8 as BS import qualified Data.Sequence as S import qualified Data.Text as T import qualified Data.Vector as V+import Data.Maybe (fromMaybe) import Network.HTTP.Conduit import Data.Default.Class @@ -115,7 +117,7 @@ (|@) :: Value -> T.Text -> Value-(|@) (Object obj) key = M.lookupDefault (error errMsg) key obj+(|@) (Object obj) key = fromMaybe (error errMsg) $ M.lookup (M.fromText key) obj where errMsg = "No such key: " ++ T.unpack key ++ " In: " ++ show obj (|@) _ _ = error "not an object"
src/Bio/RealWorld/Ensembl.hs view
@@ -7,7 +7,7 @@ import Data.Aeson import Data.List.Split (chunksOf) import qualified Data.ByteString.Char8 as B-import qualified Data.HashMap.Strict as M+import qualified Data.Aeson.KeyMap as M import Network.HTTP.Conduit import Bio.RealWorld.ID (BioID(..), EnsemblID)
src/Bio/Utils/Functions.hs view
@@ -8,7 +8,7 @@ , filterFDR , slideAverage , hyperquick- , kdeWeight+ , gaussianKDE , kld , jsd , binarySearch@@ -95,19 +95,19 @@ e = 1e-20 -- | Assign weights to the points according to density estimation.-kdeWeight :: Int -- ^ number of mesh points used in KDE- -> U.Vector Double -> U.Vector Double-kdeWeight n xs = U.map getDensity xs+gaussianKDE :: Int -- ^ number of mesh points used in KDE+ -> U.Vector Double -> (Double -> Double)+gaussianKDE n xs = \x -> + let i = binarySearch points x+ lo = points U.! (i - 1)+ lo_d = den U.! (i - 1) + hi = points U.! i+ hi_d = den U.! i+ hi_w = (x - lo) / (hi - lo)+ lo_w = 1 - hi_w+ in lo_w * lo_d + hi_w * hi_d where (points, den) = kde n xs- getDensity x = let i = binarySearch points x- lo = points U.! (i - 1)- lo_d = den U.! (i - 1) - hi = points U.! i- hi_d = den U.! i- hi_w = (x - lo) / (hi - lo)- lo_w = 1 - hi_w- in lo_w * lo_d + hi_w * hi_d -- | compute the Kullback-Leibler divergence between two valid (not check) probability distributions. -- kl(X,Y) = \sum_i P(x_i) log_2(P(x_i)\/P(y_i)).
tests/Tests/Fastq.hs view
@@ -3,6 +3,9 @@ module Tests.Fastq (tests) where import Bio.Data.Fastq+import Data.Conduit.Zlib (ungzip, multiple, gzip)+import qualified Data.ByteString.Char8 as B+import qualified Data.ByteString.Lazy.Char8 as BL import Lens.Micro import Conduit import Test.Tasty@@ -14,12 +17,19 @@ tests :: TestTree tests = testGroup "Test: Bio.Data.Fastq"- [ fastqIO+ [ testCase "FASTQ IO" fastqIO ] -fastqIO :: TestTree-fastqIO = goldenVsFile "FASTQ Read/Write Test" input output io- where- io = runResourceT $ runConduit $ streamFastq input .| sinkFastq output- input = "tests/data/test.fastq" - output = "out.fastq"+fastqIO :: Assertion+fastqIO = do+ a <- fmap B.concat $ runResourceT $ runConduit $+ sourceFile "tests/data/test.fastq.gz" .| multiple ungzip .| sinkList+ b <- fmap B.concat $ runResourceT $ runConduit $+ sourceFile "tests/data/test_wrap.fastq.gz" .| multiple ungzip .| sinkList+ let fq1 = B.concat $ replicate 1000 a+ fq2 = B.concat $ replicate 1000 b+ r1 = B.concat $ runIdentity $ runConduit $ yield fq1 .|+ parseFastqC .| mapC fastqToByteString .| unlinesAsciiC .| sinkList+ r2 = B.concat $ runIdentity $ runConduit $ yield fq2 .|+ parseFastqC .| mapC fastqToByteString .| unlinesAsciiC .| sinkList+ [True, True] @=? [r1 == fq1, r2 == fq1]
− tests/data/test.fastq
@@ -1,200 +0,0 @@-@M00436:256:000000000-B3PGP:1:1101:12997:1870 2:N:0:TAAGACGA-TTTTTCCCTCCTTTTCTCTTCTCCTCTTTTTTTTTTTTTTTTTTTTTTTTT-+-111>1111B1111313A33A1B11B01BDAB0AA/AAAAA>E>>>E>EE<<-@M00436:256:000000000-B3PGP:1:1101:20142:2157 2:N:0:TAAGGCGA-CATTAGAGCCTGTTATTAATGATTGTAATGTATTTTCTGTATAATTTTACT-+-11>>>13B1>>BBGFGBGGGGF3BBAGHFHHHHGG3FBFGHFHFGDFGFHG-@M00436:256:000000000-B3PGP:1:1101:15166:2177 2:N:0:TAAGGCGA-TGCCACGTGATTGCTGAGGCTGTAAGAACCACCCTGGGTCCCCGTGGCATG-+-A11>>1>>1>FFCGGFGGGGGGHHG3BDFGH0FGCCGGGGHGHGFCCGFHH-@M00436:256:000000000-B3PGP:1:1101:16584:2188 2:N:0:TAAGGCGA-CTAGTAAGGCATTGTAAAAGTTACTGGATTTGGTTTAAAAAAAAAAAAAA-+->A11>BF11>CBAA3BGGG11BEGAE1FD1GD1000EGGGHCGGGGG?E@-@M00436:256:000000000-B3PGP:1:1101:15256:2192 2:N:0:TAAGGCGA-CTTTGGAACAACTATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-+-1AA?11CFBFFABG3FGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG-@M00436:256:000000000-B3PGP:1:1101:18301:2193 2:N:0:TAAGGCGA-CACCTACAGAAGGAGCGCTGTGCCCCCTGGAGCTGACAAGAAAGCTGAGGC-+-111>AFCC1DFFA1FG?FGAEGHHHGGGGABGGHHDG11000BFGHG1BFG-@M00436:256:000000000-B3PGP:1:1101:13721:2196 2:N:0:TAAGGCGA-TAGCCTGAGCGTTTAATTTATTCAGTACCTGTGTTTGTGTGAATGCGGTGT-+-111>AFFBBFDAECG3FGDGGGHGGHFHBGHHHBBFFGFGFHBGHGGGEAA-@M00436:256:000000000-B3PGP:1:1101:14584:2200 2:N:0:TAAGGCGA-GCAAAAGGACCATTTAAAGTAAAAAAAAAAAAAAAAAAAAAAAATCTCTCC-+-1>>1>BCAFFAAGFGG3FGG3FG3GG?ECGGGGGC?EGCEGGE@FH2B2BC-@M00436:256:000000000-B3PGP:1:1101:11335:2200 2:N:0:TAAGGCGA-CTGAATGCCATTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-+-1AAAA33@11113BGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG-@M00436:256:000000000-B3PGP:1:1101:13303:2201 2:N:0:TAAGGCGA-TGCTTATACAATGTGAGTGTACTGAGGTAAGGGGAATATGGGAGCAGAGAC-+-A3>A?FFF5BCFFDGGGFGGGGHHGHGCF5GHA?EGGFGHGFFEEG3FHCG-@M00436:256:000000000-B3PGP:1:1101:13286:2203 2:N:0:TAAGGCGA-TTCCCGAGACCGGCAGGCCTCAGCCCAAAAGAACAAAGGGAGAAAGAACTG-+-1>111A>111>10AE00AA101110AGHH/0/00B0B00///A011B0011-@M00436:256:000000000-B3PGP:1:1101:11054:2203 2:N:0:TAAGGCGA-TTCGTACTCTGAGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGCACTC-+-1111>>1?DBF1BB31FFE3BA1B1E3BF1A0AEECAF////A/BA22BGC-@M00436:256:000000000-B3PGP:1:1101:15278:2204 2:N:0:TAAGGCGA-ACATAGTTCAGTATGAAAATAAGAGAATAAAATCTGTTATAAGCAAGTGAT-+-111>1@DFDBFFFGGGGF1BFGF1E11BDHFCGFDHGHHHH3GFH0GAEHH-@M00436:256:000000000-B3PGP:1:1101:14285:2204 2:N:0:TAAGGCGA-AATGTGCGTATTGAGCACATTAAGCACTCTAAGAGCCGAGATAGCTTCCTG-+-11>1AFBAAA1@D3GGGGGGGGG1GFFH0E1F31E0F?0AECBADDGGHHE-@M00436:256:000000000-B3PGP:1:1101:15307:2205 2:N:0:TAAGGCGA-TCTATAAGAAGGAGAAAGCTCGAGTCATCACTGAGGAAGAGAAGAATTTC-+-AA3AAFDDBDCFAGECGFFGGGGGHCFHHGHBGHHGHHHHHGHHHHHHBG-@M00436:256:000000000-B3PGP:1:1101:17837:2208 2:N:0:TAAGGCGA-GCAGAGGTGAATGGGATTCAGACGGTACTAAAAAAAAAAAAAAAAAAAAA-+-111>1A?1>FFFDCFGCEGGGGGCGEHEHFFHFFAEEGCEEGGGGGGGGG-@M00436:256:000000000-B3PGP:1:1101:14152:2208 2:N:0:TAAGGCGA-TCTATGCTCCCTCTGTGTTAGAATTGGCTGAAGTGTTTTTGTGCAGCTGAC-+-AA>A1BD311>1A113331BFGH3311010BFE313300000A1E1FE1F0-@M00436:256:000000000-B3PGP:1:1101:17005:2214 2:N:0:TAAGGCGA-GTCTTGAGAGCTTCCTTTTGCTTTCTTCTCTTGCCTCTGAGAACATCAGCC-+-1AAA>FFCA1A1B1EA3311B313A333313311B11B1F1FGCG1FH110-@M00436:256:000000000-B3PGP:1:1101:15244:2216 2:N:0:TAAGGCGA-GCCAAGAATGTGTTGTCTAAAATGCCTGTTTAGTTTTCAAGGATGGAACTC-+-1>>AAAFFD@333B11B3BGGGFAAEA11B3GEAD333FHB1F1EFHH11A-@M00436:256:000000000-B3PGP:1:1101:12952:2217 2:N:0:TAAGGCGA-GAACTGGAGCGTGTGGCCAAGTCTAACCGCTGATTTCCCAGCTGCTGCCT-+-111>AD1CFBDAEA11FFFGAAGFDFGF0EECE1GFHHFGFHHHFHHGFG-@M00436:256:000000000-B3PGP:1:1101:16915:2218 2:N:0:TAAGGCGA-ATGCACATGTGGTGTAGGAACTTTTTTCTACCATAAGTGACACCAATAAAT-+-3>3AAFFFFD@BAFFDFGGGGGHHHHGHGHCHGHHHBFBGGFGGGFHGHHH-@M00436:256:000000000-B3PGP:1:1101:11613:2220 2:N:0:TAAGGCGA-TGTGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGTAGATCTC-+-33>AADFFFFFFCGGGGFGGFCHHH4GFHFGDGGGCFFDGGEE1BFFHFH5-@M00436:256:000000000-B3PGP:1:1101:18615:2225 2:N:0:TAAGGCGA-CCTATCAGGAGTTCACTGACCACCTCGTCAAGACCCACACCAGAGTCTCCG-+->AAAAFFFFFB4FFGGFFGGGGHG4GDHGHGBGHBGHGGGGHGFEDGHHHG-@M00436:256:000000000-B3PGP:1:1101:11230:2227 2:N:0:TAAGGCGA-GTACTGTCACTTAACCCCTATTAACATACGGTGTTCAAGCCTTCCAGTATC-+-?A?AAFFFBDFBFDFFGCGGGGCFHFBDHFG4FE2DFFGHDGBGFGHBGBF-@M00436:256:000000000-B3PGP:1:1101:14569:2228 2:N:0:TAAGGCGA-GTGAATGGAAATGCCCCAACTAAATACTACCGTATGGCCCACCATAATTAC-+-3>AAAFFFBFFFGFGGFEFFGBGHGFHHHHHGGGGFGHHHGGGDH3GGHGH-@M00436:256:000000000-B3PGP:1:1101:15926:2228 2:N:0:TAAGGCGA-AATCTAGGAAAATAAAACAAGAGAAGCTGAATTAAAAAAAAAAAAAAAAA-+->AAA1FF1BDFFGGGGGFGG111B101ABGHDGGHHHHGGGGGGGGGGGG-@M00436:256:000000000-B3PGP:1:1101:15169:2228 2:N:0:TAAGGCGA-GTATCAACGAAAAGTGAGACTCATTGCTGCCCGCCGAAATGAACGGCTGCG-+-1>A1AFF1>1>AGB11313A11B3331311000A00/A//11B10//////-@M00436:256:000000000-B3PGP:1:1101:15774:2230 2:N:0:TAAGGCGA-CCCAAAGACAAGGAAAGGAAAAAATAAAAACAACAAATACCTAAAAGCTG-+-111>AFF11>C11111111BE0F0011D110000BGC1F1111BGGD011-@M00436:256:000000000-B3PGP:1:1101:11431:2230 2:N:0:TAAGGCGA-GAGCTGAACCTGTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA-+-111>A1DD1>>1BGGDGGGCEEEEGGGCGGGGGGCEGCEEGCGCGCCCCG-@M00436:256:000000000-B3PGP:1:1101:19030:2230 2:N:0:TAAGGCGA-ATCCCATTACTCTCTTTGTGGAGAAGGAACGAGATAAGGAAGTCAGTGATG-+-1AAAAFFFFBBD3FFAFF3BEGGHHH00FG?EGGGGFFFHHG1FGHDGGHB-@M00436:256:000000000-B3PGP:1:1101:16869:2231 2:N:0:TAAGGCGA-CCTTCCACCTGGTCCGGAGATCCCTGGACCTTAGGAGGCACTCATTTTTCC-+-AAAA1>@D111111A1110A01101100A001BA110A/BC0AG12AA10A-@M00436:256:000000000-B3PGP:1:1101:12374:2231 2:N:0:TAAGGCGA-CTTTAGATGGTGGGGACATCATCAATGCCTTGTGCTTCAGCCCCAACCGCT-+-?AAAAFFFFBBDEEGGEGGGFGHHHG5FGGGHFEDGHHHHGHGGGEGG?EA-@M00436:256:000000000-B3PGP:1:1101:14609:2232 2:N:0:TAAGGCGA-TCCTCCTAAGTAACTGGGACTACATATGTGCATCACCACGTCCAGTTAATT-+-3>>AAFFFFFFFFGGGFAAG4GG4FD5A66DGHBHH4DC22BFE3GH5EFG-@M00436:256:000000000-B3PGP:1:1101:11898:2233 2:N:0:TAAGGCGA-GTACTGTAGTCACTCAGTATTTGTATATGTTGCTAGAATTTAGATTGTAA-+-1A1AAFFFFFFFGBGGGBEF3BF3FFGFFGGGHFBGGFFDGGFFFFHFGF-@M00436:256:000000000-B3PGP:1:1101:15215:2233 2:N:0:TAAGGCGA-GTAAAAGAGTATATGTAAACTGAATGAGAACTAAAAAATAGAAATAAAAC-+-AA1AAFF113@33333BFF1311B3311DF11FGGHH00B11DG1FAGH1-@M00436:256:000000000-B3PGP:1:1101:18320:2233 2:N:0:TAAGGCGA-GCATTTAATATTGATACACTTTCACCTCTAAAATGGATTTGAAGAAATGC-+-111>>DF3BBDFGGGGGG1FBGFFCHHHHGF3ADF1GGHFH2A1AB0BFG-@M00436:256:000000000-B3PGP:1:1101:13822:2234 2:N:0:TAAGGCGA-TCCACAAGTACTCTGGCAAGGAAGGAGACAAGCACACCCTGAGCAAGAAGG-+-BA3ABFA?DFFFFDGGCGGGCGHFE4AGFHBCGFHGFE2EFFFBHHEHBEF-@M00436:256:000000000-B3PGP:1:1101:12165:2235 2:N:0:TAAGGCGA-ACCATGCTGTGTCTGTTATGCGGCAAAGCCGAAGATACTAACAGTATTCTC-+-AA?A@1B11313A3133B311110AEH0000AE0E1F11F21B11D2222A-@M00436:256:000000000-B3PGP:1:1101:19900:2236 2:N:0:TAAGGCGA-CCATTTTAGTTCAGGAGTGTTTCCTTATTTTCTCTTTTCTGATAGAGTTT-+->>3>AFFFFFFFGGGGCGGABGHHHCFHHGGHHHHHHHHHHHHHGHFHHH-@M00436:256:000000000-B3PGP:1:1101:11136:2236 2:N:0:TAAGGCGA-GGAGAGGAGCGAGGCTGAGAGAAGAGAAGAACAATGTACTCATAAAGAAAC-+->111111B111110000A0B1AE0F0F101B00B112D2211112111B00-@M00436:256:000000000-B3PGP:1:1101:15661:2236 2:N:0:TAAGGCGA-GTGTTGCCCAGGCTGGTCTCAAACTCCTGGGCTCAAGCGATCCTCCCACCT-+->A>AABFFFFAAGGGFAFFFFGDEGECGF4FDFHFHHHGGEEEHGGG2FEG-@M00436:256:000000000-B3PGP:1:1101:20014:2238 2:N:0:TAAGGCGA-TGTGCATCACAGAGGTGTGCATCACCTTTGACCAGGCTGACCTGACCATC-+-1111>B3311DDGCC1A1ABGFFHHB1BAGHHHHFEC0FF001FGBHFHH-@M00436:256:000000000-B3PGP:1:1101:13789:2238 2:N:0:TAAGGCGA-ACCCTGGACTCTGGACTTCGCAGGTTCCTGCCTGTCACGCCACCCCCTTCC-+->A1A11AFFFBF31FGGCGGGGGGCFFHGBGHGHHHHHGHGGGHGGEEGFH-@M00436:256:000000000-B3PGP:1:1101:11741:2240 2:N:0:TAAGGCGA-CTCCATCCGGCACCCTGACGTTGAGGTGGATGGGTTCTCTGAGCTTCGGTG-+-1>1A1FDF11DDEECGGFG?FCGHC0B0AFEGCCGCAGBFGGGGGGFGGFE-@M00436:256:000000000-B3PGP:1:1101:19980:2240 2:N:0:TAAGGCGA-GATGTGCGCATTGACACCAGGCTCAACAAAGCTGTCTGGGCCAAAGGAAT-+-11>1>DBA@AAAGGFFGFGFGGCGHHHHG0FGFHGGHF00/GE/GFFFFH-@M00436:256:000000000-B3PGP:1:1101:20675:2240 2:N:0:TAAGGCGA-GGGTCCCTCTGTACTCTGCGTTGATACCACTGCTTCCGCGGACAGGCGTGT-+-333AAAFFFFFFGGGGGGCFFGGFGHFHHHHHHHGHHGGGGEFGGGGGEGE-@M00436:256:000000000-B3PGP:1:1101:14624:2241 2:N:0:TAAGGCGA-TACTTATAAGTCTATCATTTAAAGACATGTACTGAAACAAATGTATTTGTT-+-A1>AAFFFBDDBG3EFGGGGB3FBGHHHFHHHHHFFGFB0BFGEBGGHHGH-@M00436:256:000000000-B3PGP:1:1101:11465:2241 2:N:0:TAAGGCGA-GCCTCACCGGTGACCAGCCTGGACTCGCATGGCAGCACCCAGGGCATGCTG-+-333AACAFAD>DGGGGGFGGGGHHGHGGEGCHFBEGCHHGGHGG1FGFHHG-@M00436:256:000000000-B3PGP:1:1101:20263:2242 2:N:0:TAAGGCGA-GTGTGAATGGGTTTATACTGATTTTGATATCATGTTCTTTTCATAGTCGT-+-111>ADDFFC?CCFGGGGGFFGFHHHGHHHCHHHHFHCHHHGHHHHHGFG-@M00436:256:000000000-B3PGP:1:1101:16263:2243 2:N:0:TAAGGCGA-GAACTATACTGACGAAGCCATTGAAACAGATGATCTGACCATTAAGCTGGT-+-11>AAFFFFFDFGGGG?GGGGGGGFHHHHHGHHBGHGFBFGGFHGFHFF00
+ tests/data/test.fastq.gz view
binary file changed (absent → 2986 bytes)
+ tests/data/test_wrap.fastq.gz view
binary file changed (absent → 3065 bytes)