BiobaseTypes 0.1.2.1 → 0.1.3.0
raw patch · 5 files changed
+376/−21 lines, 5 filesdep +bytestringdep +containersdep +lensdep ~deepseqPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies added: bytestring, containers, lens, mtl, utf8-string
Dependency ranges changed: deepseq
API changes (from Hackage documentation)
- Biobase.Types.Energy: [getDG] :: DeltaGibbs -> Double
- Biobase.Types.Energy: instance Biobase.Types.NumericalExtremes.NumericalEpsilon Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Biobase.Types.NumericalExtremes.NumericalExtremes Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Control.DeepSeq.NFData Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Aeson.Types.FromJSON.FromJSON Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Aeson.Types.ToJSON.ToJSON Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Binary.Class.Binary Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Default.Class.Default Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Hashable.Class.Hashable Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Serialize.Serialize Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance Data.Vector.Unboxed.Base.Unbox Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Classes.Eq Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Classes.Ord Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Generics.Generic Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Num.Num Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Read.Read Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Real.Fractional Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: instance GHC.Show.Show Biobase.Types.Energy.DeltaGibbs
- Biobase.Types.Energy: newtype DeltaGibbs
+ Biobase.Types.Energy: [dG] :: DG -> Double
+ Biobase.Types.Energy: instance Biobase.Types.NumericalExtremes.NumericalEpsilon Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Biobase.Types.NumericalExtremes.NumericalExtremes Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Control.DeepSeq.NFData Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Aeson.Types.FromJSON.FromJSON Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Aeson.Types.ToJSON.ToJSON Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Binary.Class.Binary Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Data.Data Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Default.Class.Default Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Hashable.Class.Hashable Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Serialize.Serialize Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance Data.Vector.Unboxed.Base.Unbox Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Classes.Eq Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Classes.Ord Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Generics.Generic Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Num.Num Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Read.Read Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Real.Fractional Biobase.Types.Energy.DG
+ Biobase.Types.Energy: instance GHC.Show.Show Biobase.Types.Energy.DG
+ Biobase.Types.Energy: newtype DG
+ Biobase.Types.Sequence: DNAseq :: ByteString -> DNAseq
+ Biobase.Types.Sequence: RNAseq :: ByteString -> RNAseq
+ Biobase.Types.Sequence: SequenceID :: ByteString -> SequenceID
+ Biobase.Types.Sequence: [_dnaseq] :: DNAseq -> ByteString
+ Biobase.Types.Sequence: [_rnaseq] :: RNAseq -> ByteString
+ Biobase.Types.Sequence: [_sequenceID] :: SequenceID -> ByteString
+ Biobase.Types.Sequence: class Complement f
+ Biobase.Types.Sequence: class Transcribe f where type TranscribeTo f :: * where {
+ Biobase.Types.Sequence: complement :: Complement f => Iso' f f
+ Biobase.Types.Sequence: dna2rna :: Char -> Char
+ Biobase.Types.Sequence: dnaComplement :: Char -> Char
+ Biobase.Types.Sequence: dnaseq :: Iso' DNAseq ByteString
+ Biobase.Types.Sequence: instance Biobase.Types.Sequence.Complement Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Biobase.Types.Sequence.Complement Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Biobase.Types.Sequence.Transcribe Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Biobase.Types.Sequence.Transcribe Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Control.DeepSeq.NFData Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Control.DeepSeq.NFData Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Control.DeepSeq.NFData Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance Control.Lens.At.Ixed Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Control.Lens.At.Ixed Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Control.Lens.Internal.Iso.Reversing Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Control.Lens.Internal.Iso.Reversing Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Data.Data.Data Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Data.Data.Data Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Data.Data.Data Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance Data.String.IsString Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance Data.String.IsString Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance Data.String.IsString Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance GHC.Classes.Eq Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance GHC.Classes.Eq Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance GHC.Classes.Eq Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance GHC.Classes.Ord Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance GHC.Classes.Ord Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance GHC.Classes.Ord Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance GHC.Generics.Generic Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance GHC.Generics.Generic Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance GHC.Generics.Generic Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance GHC.Read.Read Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance GHC.Read.Read Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance GHC.Read.Read Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: instance GHC.Show.Show Biobase.Types.Sequence.DNAseq
+ Biobase.Types.Sequence: instance GHC.Show.Show Biobase.Types.Sequence.RNAseq
+ Biobase.Types.Sequence: instance GHC.Show.Show Biobase.Types.Sequence.SequenceID
+ Biobase.Types.Sequence: mkDNAseq :: ByteString -> DNAseq
+ Biobase.Types.Sequence: mkRNAseq :: ByteString -> RNAseq
+ Biobase.Types.Sequence: newtype DNAseq
+ Biobase.Types.Sequence: newtype RNAseq
+ Biobase.Types.Sequence: newtype SequenceID
+ Biobase.Types.Sequence: rna2dna :: Char -> Char
+ Biobase.Types.Sequence: rnaComplement :: Char -> Char
+ Biobase.Types.Sequence: rnaseq :: Iso' RNAseq ByteString
+ Biobase.Types.Sequence: sequenceID :: Iso' SequenceID ByteString
+ Biobase.Types.Sequence: sequenceIDstring :: Iso' SequenceID String
+ Biobase.Types.Sequence: transcribe :: Transcribe f => Iso' f (TranscribeTo f)
+ Biobase.Types.Sequence: type family TranscribeTo f :: *;
+ Biobase.Types.Sequence: }
+ Biobase.Types.Structure: RNAStructureError :: String -> ByteString -> RNAStructureError
+ Biobase.Types.Structure: RNAds :: !ByteString -> !ByteString -> RNAds
+ Biobase.Types.Structure: RNAes :: ByteString -> RNAensembleStructure
+ Biobase.Types.Structure: RNApset :: Set (Int, Int) -> RNApset
+ Biobase.Types.Structure: RNAss :: ByteString -> RNAss
+ Biobase.Types.Structure: [_rnaOffender] :: RNAStructureError -> ByteString
+ Biobase.Types.Structure: [_rnaStructureError] :: RNAStructureError -> String
+ Biobase.Types.Structure: [_rnadsL] :: RNAds -> !ByteString
+ Biobase.Types.Structure: [_rnadsR] :: RNAds -> !ByteString
+ Biobase.Types.Structure: [_rnaes] :: RNAensembleStructure -> ByteString
+ Biobase.Types.Structure: [_rnapset] :: RNApset -> Set (Int, Int)
+ Biobase.Types.Structure: [_rnass] :: RNAss -> ByteString
+ Biobase.Types.Structure: data RNAStructureError
+ Biobase.Types.Structure: data RNAds
+ Biobase.Types.Structure: instance Control.DeepSeq.NFData Biobase.Types.Structure.RNAStructureError
+ Biobase.Types.Structure: instance Control.DeepSeq.NFData Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance Control.DeepSeq.NFData Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance Control.DeepSeq.NFData Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance Control.DeepSeq.NFData Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance Data.Data.Data Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance Data.Data.Data Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance Data.Data.Data Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Base.Monoid Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Classes.Eq Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance GHC.Classes.Eq Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance GHC.Classes.Eq Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance GHC.Classes.Eq Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Classes.Ord Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance GHC.Classes.Ord Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance GHC.Classes.Ord Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance GHC.Classes.Ord Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Generics.Generic Biobase.Types.Structure.RNAStructureError
+ Biobase.Types.Structure: instance GHC.Generics.Generic Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance GHC.Generics.Generic Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance GHC.Generics.Generic Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance GHC.Generics.Generic Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Read.Read Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance GHC.Read.Read Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance GHC.Read.Read Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance GHC.Read.Read Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: instance GHC.Show.Show Biobase.Types.Structure.RNAStructureError
+ Biobase.Types.Structure: instance GHC.Show.Show Biobase.Types.Structure.RNAds
+ Biobase.Types.Structure: instance GHC.Show.Show Biobase.Types.Structure.RNAensembleStructure
+ Biobase.Types.Structure: instance GHC.Show.Show Biobase.Types.Structure.RNApset
+ Biobase.Types.Structure: instance GHC.Show.Show Biobase.Types.Structure.RNAss
+ Biobase.Types.Structure: mkRNAds :: (Monad m, MonadError RNAStructureError m) => ByteString -> m RNAds
+ Biobase.Types.Structure: newtype RNAensembleStructure
+ Biobase.Types.Structure: newtype RNApset
+ Biobase.Types.Structure: newtype RNAss
+ Biobase.Types.Structure: pairDist :: RNApset -> RNApset -> Int
+ Biobase.Types.Structure: rnads :: Prism' ByteString RNAds
+ Biobase.Types.Structure: rnads2rnassPair :: Iso' RNAds (RNAss, RNAss)
+ Biobase.Types.Structure: rnadsL :: Lens' RNAds ByteString
+ Biobase.Types.Structure: rnadsR :: Lens' RNAds ByteString
+ Biobase.Types.Structure: rnaes :: Iso' RNAensembleStructure ByteString
+ Biobase.Types.Structure: rnapset :: Iso' RNApset (Set (Int, Int))
+ Biobase.Types.Structure: rnass :: Iso' RNAss ByteString
+ Biobase.Types.Structure: rnassPairSet :: (MonadError String m) => RNAss -> m RNApset
+ Biobase.Types.Structure: rnassPairSet' :: RNAss -> RNApset
+ Biobase.Types.Structure: verifyRNAss :: (Monad m, MonadError RNAStructureError m) => RNAss -> m RNAss
- Biobase.Types.Energy: DG :: Double -> DeltaGibbs
+ Biobase.Types.Energy: DG :: Double -> DG
Files
- Biobase/Types/Energy.hs +17/−16
- Biobase/Types/Sequence.hs +199/−0
- Biobase/Types/Structure.hs +138/−0
- BiobaseTypes.cabal +17/−5
- changelog.md +5/−0
Biobase/Types/Energy.hs view
@@ -7,8 +7,10 @@ module Biobase.Types.Energy where import Control.DeepSeq+import Control.Lens import Data.Aeson (FromJSON, ToJSON) import Data.Binary (Binary)+import Data.Data import Data.Default import Data.Hashable import Data.Serialize (Serialize)@@ -28,31 +30,30 @@ -- -- TODO shall we phantom-type the actual units? -newtype DeltaGibbs = DG { getDG :: Double }- deriving (Eq,Ord,Num,Fractional,Read,Show,Generic)--+newtype DG = DG { dG :: Double }+ deriving (Eq,Ord,Num,Fractional,Read,Show,Generic,Data,Typeable)+makeLenses ''DG -derivingUnbox "DeltaGibbs"- [t| DeltaGibbs -> Double |] [| getDG |] [| DG |]+derivingUnbox "DG"+ [t| DG -> Double |] [| dG |] [| DG |] -instance Hashable DeltaGibbs-instance Binary DeltaGibbs-instance Serialize DeltaGibbs-instance FromJSON DeltaGibbs-instance ToJSON DeltaGibbs-instance NFData DeltaGibbs+instance Hashable DG+instance Binary DG+instance Serialize DG+instance FromJSON DG+instance ToJSON DG+instance NFData DG -deriving instance NumericalExtremes DeltaGibbs-deriving instance NumericalEpsilon DeltaGibbs+deriving instance NumericalExtremes DG+deriving instance NumericalEpsilon DG -instance Default DeltaGibbs where+instance Default DG where def = maxLarge {-# Inline def #-} --- | @round $ DeltaGibbs / 100@.+-- | @round $ DG / 100@. newtype DeltaDekaGibbs = DekaG { getDekaG :: Int } deriving (Eq,Ord,Num,Read,Show,Generic)
+ Biobase/Types/Sequence.hs view
@@ -0,0 +1,199 @@++-- | Wrappers around biosequences.++module Biobase.Types.Sequence where++import Control.Lens+import Control.DeepSeq+import Data.ByteString (ByteString)+import Data.Char (ord,chr,toUpper)+import Data.Data (Data)+import Data.Typeable (Typeable)+import GHC.Generics (Generic)+import qualified Data.ByteString.Char8 as BS+import qualified Data.ByteString.UTF8 as BSU+import GHC.Exts (IsString(..))++++-- | A sequence identifier. Just a newtype wrapped text field. Because we can+-- never know what people are up to, this is utf8-encoded.+--+-- TODO Provide @Iso'@ for @Text@, too?++newtype SequenceID = SequenceID { _sequenceID ∷ ByteString }+ deriving (Data, Typeable, Generic, Eq, Ord, Read, Show, IsString)+makeLenses ''SequenceID++instance NFData SequenceID++-- | Convert to a string in a unicode-aware manner.++sequenceIDstring ∷ Iso' SequenceID String+sequenceIDstring = sequenceID . iso BSU.toString BSU.fromString+{-# Inline sequenceIDstring #-}++++-- | A short RNA sequence.+--+-- It is an instance of 'Ixed' to allow @RNAseq (BS.pack "cag") ^? ix 2 == Just 'g'@.++newtype RNAseq = RNAseq { _rnaseq ∷ ByteString }+ deriving (Data, Typeable, Generic, Eq, Ord, Read, Show)+makeLenses ''RNAseq++instance NFData RNAseq++type instance Index RNAseq = Int++type instance IxValue RNAseq = Char++instance Ixed RNAseq where+ ix k = rnaseq . ix k . iso (chr . fromIntegral) (fromIntegral . ord)+ {-# Inline ix #-}++deriving instance Reversing RNAseq++mkRNAseq ∷ ByteString → RNAseq+mkRNAseq = RNAseq . BS.map go . BS.map toUpper+ where go x | x `elem` acgu = x+ | otherwise = 'N'+ acgu ∷ String+ acgu = "ACGU"++instance IsString RNAseq where+ fromString = mkRNAseq . BS.pack++++-- | A short DNA sequence.+--+-- Note everything really long should be handled by specialized libraries with+-- streaming capabilities.++newtype DNAseq = DNAseq { _dnaseq ∷ ByteString }+ deriving (Data, Typeable, Generic, Eq, Ord, Read, Show)+makeLenses ''DNAseq++instance NFData DNAseq++type instance Index DNAseq = Int++type instance IxValue DNAseq = Char++instance Ixed DNAseq where+ ix k = dnaseq . ix k . iso (chr . fromIntegral) (fromIntegral . ord)+ {-# Inline ix #-}++mkDNAseq ∷ ByteString → DNAseq+mkDNAseq = DNAseq . BS.map go . BS.map toUpper+ where go x | x `elem` acgt = x+ | otherwise = 'N'+ acgt ∷ String+ acgt = "ACGT"++instance IsString DNAseq where+ fromString = mkDNAseq . BS.pack++deriving instance Reversing DNAseq++-- | Simple case translation from @U@ to @T@. with upper and lower-case+-- awareness.++rna2dna ∷ Char → Char+rna2dna = \case+ 'U' → 'T'+ 'u' → 't'+ x → x+{-# Inline rna2dna #-}++-- | Single character RNA complement.++rnaComplement ∷ Char → Char+rnaComplement = \case+ 'A' → 'U'+ 'a' → 'u'+ 'C' → 'G'+ 'c' → 'g'+ 'G' → 'C'+ 'g' → 'c'+ 'U' → 'A'+ 'u' → 'a'+ x → x+{-# Inline rnaComplement #-}++-- | Simple case translation from @T@ to @U@ with upper- and lower-case+-- awareness.++dna2rna ∷ Char → Char+dna2rna = \case+ 'T' → 'U'+ 't' → 'u'+ x → x+{-# Inline dna2rna #-}++-- | Single character DNA complement.++dnaComplement ∷ Char → Char+dnaComplement = \case+ 'A' → 'T'+ 'a' → 't'+ 'C' → 'G'+ 'c' → 'g'+ 'G' → 'C'+ 'g' → 'c'+ 'T' → 'A'+ 't' → 'a'+ x → x+{-# Inline dnaComplement #-}++++-- | Transcribes a DNA sequence into an RNA sequence. Note that 'transcribe' is+-- actually very generic. We just define its semantics to be that of+-- biomolecular transcription.+--+-- 'transcribe' makes the assumption that, given @DNA -> RNA@, we transcribe+-- the coding strand.+-- <http://hyperphysics.phy-astr.gsu.edu/hbase/Organic/transcription.html>+--+-- @@ DNAseq "ACGT" ^. transcribe == RNAseq "ACGU" RNAseq "ACGU" ^. transcribe+-- == DNAseq "ACGT" RNAseq "ACGU" ^. from transcribe :: DNAseq == DNAseq "ACGT"+-- @@++class Transcribe f where+ type TranscribeTo f ∷ *+ transcribe ∷ Iso' f (TranscribeTo f)++-- | Transcribe a DNA sequence into an RNA sequence. This does not @reverse@+-- the sequence!++instance Transcribe DNAseq where+ type TranscribeTo DNAseq = RNAseq+ transcribe = iso (RNAseq . BS.map dna2rna . _dnaseq) (DNAseq . BS.map rna2dna . _rnaseq)+ {-# Inline transcribe #-}++-- | Transcribe a RNA sequence into an DNA sequence. This does not @reverse@+-- the sequence!++instance Transcribe RNAseq where+ type TranscribeTo RNAseq = DNAseq+ transcribe = from transcribe+ {-# Inline transcribe #-}++++-- | The complement of a biosequence.++class Complement f where+ complement ∷ Iso' f f++instance Complement DNAseq where+ complement = iso (DNAseq . BS.map dnaComplement . _dnaseq) (DNAseq . BS.map dnaComplement . _dnaseq)+ {-# Inline complement #-}++instance Complement RNAseq where+ complement = iso (RNAseq . BS.map rnaComplement . _rnaseq) (RNAseq . BS.map rnaComplement . _rnaseq)+ {-# Inline complement #-}+
+ Biobase/Types/Structure.hs view
@@ -0,0 +1,138 @@++-- | Wrappers for structural data. Encoded as bytestrings. This differs from+-- @BiobaseXNA@, where specialized encodings are used. These structures are+-- supposedly "short", they need to fit into a strict bytestring.+--+-- TODO Consider where to move each type. There are merge possibilities between+-- BiobaseXNA and BiobaseTypes.++module Biobase.Types.Structure where++import Control.DeepSeq+import Control.Lens+import Control.Monad.Error.Class+import Control.Monad (foldM,unless)+import Data.ByteString (ByteString)+import Data.Data+import Data.Set (Set)+import GHC.Generics (Generic)+import qualified Data.ByteString.Char8 as BS8+import qualified Data.List as L+import qualified Data.Set as Set++++-- | Secondary structure using @()@ for paired elements, and @.@ for unpaired+-- ones. It is assumed that the @()@ match up. These structures from a Monoid.++newtype RNAss = RNAss { _rnass ∷ ByteString }+ deriving (Eq,Ord,Show,Read,Data,Typeable,Generic,Monoid)+makeLenses ''RNAss++instance NFData RNAss++-- | Ensemble structure encoding. *Very* different type ctor name chosen! The+-- structure of this string makes verification much more complicated.+--+-- TODO describe encoding used by RNAfold for the ensemble string.++newtype RNAensembleStructure = RNAes { _rnaes ∷ ByteString }+ deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)+makeLenses ''RNAensembleStructure++instance NFData RNAensembleStructure++-- | Cofolded structure.++data RNAds = RNAds+ { _rnadsL ∷ !ByteString+ , _rnadsR ∷ !ByteString+ }+ deriving (Eq,Ord,Show,Read,Data,Typeable,Generic)+makeLenses ''RNAds++instance NFData RNAds++-- | A Prism that turns ByteStrings with a single @&@ into @RNAds@.++rnads ∷ Prism' ByteString RNAds+rnads = prism (\(RNAds l r) → BS8.concat [l, "&", r])+ (\s → case BS8.split '&' s of [l,r] → Right (RNAds l r) ; _ → Left s)+{-# Inline rnads #-}++-- | Isomorphism from @RNAds@ to @(RNAss,RNAss)@. The @RNAss@ are only+-- legal if taken both: @rnassFromDimer . both@.++rnads2rnassPair ∷ Iso' RNAds (RNAss, RNAss)+rnads2rnassPair = iso (\(RNAds l r) → (RNAss l, RNAss r)) (\(RNAss l, RNAss r) → RNAds l r)+{-# Inline rnads2rnassPair #-}++-- | Try to create a dimeric structure.++mkRNAds ∷ (Monad m, MonadError RNAStructureError m) ⇒ ByteString → m RNAds+mkRNAds q = BS8.split '&' q & \case+ [l,r] → do+ -- TODO can still fail with unmatched brackets.+ return $ RNAds+ { _rnadsL = l+ , _rnadsR = r+ }+ _ → throwError $ RNAStructureError "mkRNAds: not a dimer" q+{-# Inline mkRNAds #-}++-- | Capture what might be wrong with the RNAss.++data RNAStructureError = RNAStructureError+ { _rnaStructureError ∷ String+ , _rnaOffender ∷ ByteString+ }+ deriving (Show,Generic)++instance NFData RNAStructureError++-- | Verifies that the given RNAss is properly formatted. Otherwise, error out.+--+-- TODO Implement! Check with BiobaseXNA and the stack effort in there. This+-- might influence if the verification goes into BiobaseXNA and happens via an+-- @Iso'@.++verifyRNAss ∷ (Monad m, MonadError RNAStructureError m) ⇒ RNAss → m RNAss+verifyRNAss ss = do+ return ss++newtype RNApset = RNApset { _rnapset ∷ Set (Int,Int) }+ deriving (Read,Show,Eq,Ord,Generic)+makeLenses ''RNApset++instance NFData RNApset++-- | Transform an 'RNAss' into a set of base pairs @(i,j)@. The pairs are+-- 0-based.++rnassPairSet+ ∷ (MonadError String m)+ ⇒ RNAss+ → m RNApset+rnassPairSet (RNAss s2) = do+ let go (set,ks ) (i,'(') = return (set,i:ks)+ go (set,i:is) (j,')') = return (Set.insert (i,j) set, is)+ go (set,[] ) (j,')') = throwError $ "unequal brackets in \"" ++ BS8.unpack s2 ++ "\" at position: " ++ show j+ go (set,ks ) (_,'.') = return (set,ks)+ (set,ss) ← foldM go (Set.empty,[]) . L.zip [0..] $ BS8.unpack s2+ unless (null ss) $ throwError $ "unequal brackets in \"" ++ BS8.unpack s2 ++ "\" with opening bracket(s): " ++ show ss+ return $ RNApset set+{-# Inlinable rnassPairSet #-}++-- | RNA pair set, but a transformation error calls @error@.++rnassPairSet' ∷ RNAss → RNApset+rnassPairSet' = either error id . rnassPairSet++-- | Calculates the number of different base pairs betwwen two structures.++pairDist ∷ RNApset → RNApset → Int+pairDist (RNApset p1) (RNApset p2) = Set.size z1 + Set.size z2+ where i = Set.intersection p1 p2+ z1 = p1 `Set.difference` i+ z2 = p2 `Set.difference` i+
BiobaseTypes.cabal view
@@ -1,7 +1,7 @@ name: BiobaseTypes-version: 0.1.2.1-author: Christian Hoener zu Siederdissen, 2015 - 2016-copyright: Christian Hoener zu Siederdissen, 2015 - 2016+version: 0.1.3.0+author: Christian Hoener zu Siederdissen, 2015 - 2017+copyright: Christian Hoener zu Siederdissen, 2015 - 2017 homepage: https://github.com/choener/BiobaseTypes bug-reports: https://github.com/choener/BiobaseTypes/issues maintainer: choener@bioinf.uni-leipzig.de@@ -11,7 +11,7 @@ build-type: Simple stability: experimental cabal-version: >= 1.10.0-tested-with: GHC == 7.10.3, GHC == 8.0.1+tested-with: GHC == 8.0.2, GHC == 8.2.1 synopsis: Collection of types for bioinformatics description: Types used in a number of bioinformatics libraries.@@ -21,6 +21,8 @@ * energies . * numerics+ .+ * biostring wrappers @@ -34,18 +36,23 @@ build-depends: base >= 4.7 && < 5.0 , aeson >= 0.8 , binary >= 0.7+ , bytestring , cereal >= 0.4 , cereal-text >= 0.1 , cereal-vector >= 0.2+ , containers , data-default >= 0.5- , deepseq >= 1.3+ , deepseq >= 1.4 , hashable >= 1.2 , intern >= 0.9+ , lens >= 4.0+ , mtl , primitive >= 0.5 , QuickCheck >= 2.7 , string-conversions >= 0.4 , text >= 1.0 , text-binary >= 0.2+ , utf8-string >= 1.0 , vector >= 0.10 , vector-binary-instances >= 0.2 , vector-th-unbox >= 0.2@@ -63,17 +70,21 @@ Biobase.Types.Names.Internal Biobase.Types.NumericalExtremes Biobase.Types.Odds+ Biobase.Types.Sequence Biobase.Types.Strand+ Biobase.Types.Structure Biobase.Types.Taxonomy default-language: Haskell2010 default-extensions: BangPatterns , DataKinds+ , DeriveDataTypeable , DeriveGeneric , FlexibleContexts , FlexibleInstances , GeneralizedNewtypeDeriving , KindSignatures+ , LambdaCase , MultiParamTypeClasses , OverloadedStrings , PatternSynonyms@@ -82,6 +93,7 @@ , TemplateHaskell , TypeFamilies , TypeOperators+ , UnicodeSyntax ghc-options: -O2 -funbox-strict-fields
changelog.md view
@@ -1,3 +1,8 @@+0.1.3.0+-------++- "biostring" wrappers (ByteString based RNA, DNA, ... sequences)+ 0.1.2.1 -------