module Bio.Data.BigWig
( module Data.BBI.BigWig
, accumScores
, normalizedScores
) where
import Data.BBI.BigWig
import Data.Conduit
import qualified Data.Conduit.List as CL
import Bio.Data.Bed
-- | for each BED region, return total scores of all wig records overlapped with it
accumScores :: BEDLike b => BWFile -> Conduit b IO Double
accumScores bwF = CL.mapM (helper bwF)
{-# INLINE accumScores #-}
-- | for each BED region, return normalized scores (divided by the length) of
-- all wig records overlapped with it
normalizedScores :: BEDLike b => BWFile -> Conduit b IO Double
normalizedScores bwF = CL.mapM $ \bed -> do
x <- helper bwF bed
return $ x / (fromIntegral . size) bed
{-# INLINE normalizedScores #-}
helper :: BEDLike b => BWFile -> b -> IO Double
helper bwF bed = queryBWFile bwF (chr, start, end) $$ CL.fold f 0.0
where
f acc (_, s, e, v) = acc + fromIntegral (e - s) * v
chr = chrom bed
start = chromStart bed
end = chromEnd bed
{-# INLINE helper #-}