packages feed

elynx-seq 0.6.1.0 → 0.6.1.1

raw patch · 53 files changed

+2900/−2894 lines, 53 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- ELynx.Data.Alphabet.Alphabet: AlphabetSpec :: !Set Character -> !Set Character -> !Set Character -> !Set Character -> !Set Character -> (Character -> [Character]) -> AlphabetSpec
- ELynx.Data.Alphabet.Alphabet: DNA :: Alphabet
- ELynx.Data.Alphabet.Alphabet: DNAI :: Alphabet
- ELynx.Data.Alphabet.Alphabet: DNAX :: Alphabet
- ELynx.Data.Alphabet.Alphabet: Protein :: Alphabet
- ELynx.Data.Alphabet.Alphabet: ProteinI :: Alphabet
- ELynx.Data.Alphabet.Alphabet: ProteinS :: Alphabet
- ELynx.Data.Alphabet.Alphabet: ProteinX :: Alphabet
- ELynx.Data.Alphabet.Alphabet: [all] :: AlphabetSpec -> !Set Character
- ELynx.Data.Alphabet.Alphabet: [gap] :: AlphabetSpec -> !Set Character
- ELynx.Data.Alphabet.Alphabet: [iupac] :: AlphabetSpec -> !Set Character
- ELynx.Data.Alphabet.Alphabet: [std] :: AlphabetSpec -> !Set Character
- ELynx.Data.Alphabet.Alphabet: [toStd] :: AlphabetSpec -> Character -> [Character]
- ELynx.Data.Alphabet.Alphabet: [unknown] :: AlphabetSpec -> !Set Character
- ELynx.Data.Alphabet.Alphabet: alphabetDescription :: Alphabet -> String
- ELynx.Data.Alphabet.Alphabet: alphabetSpec :: Alphabet -> AlphabetSpec
- ELynx.Data.Alphabet.Alphabet: data Alphabet
- ELynx.Data.Alphabet.Alphabet: data AlphabetSpec
- ELynx.Data.Alphabet.Alphabet: instance Data.Aeson.Types.FromJSON.FromJSON ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance Data.Aeson.Types.ToJSON.ToJSON ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Classes.Eq ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Classes.Ord ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Enum.Bounded ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Enum.Enum ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Generics.Generic ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Read.Read ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: instance GHC.Show.Show ELynx.Data.Alphabet.Alphabet.Alphabet
- ELynx.Data.Alphabet.Alphabet: isGap :: Alphabet -> Character -> Bool
- ELynx.Data.Alphabet.Alphabet: isIUPAC :: Alphabet -> Character -> Bool
- ELynx.Data.Alphabet.Alphabet: isMember :: Alphabet -> Character -> Bool
- ELynx.Data.Alphabet.Alphabet: isStd :: Alphabet -> Character -> Bool
- ELynx.Data.Alphabet.Alphabet: isUnknown :: Alphabet -> Character -> Bool
- ELynx.Data.Alphabet.Character: data Character
- ELynx.Data.Alphabet.Character: fromCVec :: Character a => Vector a -> Vector Character
- ELynx.Data.Alphabet.Character: fromChar :: Char -> Character
- ELynx.Data.Alphabet.Character: fromString :: String -> [Character]
- ELynx.Data.Alphabet.Character: fromWord :: Word8 -> Character
- ELynx.Data.Alphabet.Character: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance GHC.Classes.Eq ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance GHC.Classes.Ord ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance GHC.Enum.Bounded ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance GHC.Read.Read ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: instance GHC.Show.Show ELynx.Data.Alphabet.Character.Character
- ELynx.Data.Alphabet.Character: toCVec :: Character a => Vector Character -> Vector a
- ELynx.Data.Alphabet.Character: toChar :: Character -> Char
- ELynx.Data.Alphabet.Character: toString :: [Character] -> String
- ELynx.Data.Alphabet.Character: toWord :: Character -> Word8
- ELynx.Data.Alphabet.DistributionDiversity: entropy :: Vector v Double => v Double -> Double
- ELynx.Data.Alphabet.DistributionDiversity: frequencyCharacters :: (Vector v Character, Vector v Int, Vector v Double) => AlphabetSpec -> v Character -> v Double
- ELynx.Data.Alphabet.DistributionDiversity: homoplasy :: Vector v Double => v Double -> Double
- ELynx.Data.Alphabet.DistributionDiversity: kEffEntropy :: Vector v Double => v Double -> Double
- ELynx.Data.Alphabet.DistributionDiversity: kEffHomoplasy :: Vector v Double => v Double -> Double
- ELynx.Data.Character.AminoAcid: A :: AminoAcid
- ELynx.Data.Character.AminoAcid: C :: AminoAcid
- ELynx.Data.Character.AminoAcid: D :: AminoAcid
- ELynx.Data.Character.AminoAcid: E :: AminoAcid
- ELynx.Data.Character.AminoAcid: F :: AminoAcid
- ELynx.Data.Character.AminoAcid: G :: AminoAcid
- ELynx.Data.Character.AminoAcid: H :: AminoAcid
- ELynx.Data.Character.AminoAcid: I :: AminoAcid
- ELynx.Data.Character.AminoAcid: K :: AminoAcid
- ELynx.Data.Character.AminoAcid: L :: AminoAcid
- ELynx.Data.Character.AminoAcid: M :: AminoAcid
- ELynx.Data.Character.AminoAcid: N :: AminoAcid
- ELynx.Data.Character.AminoAcid: P :: AminoAcid
- ELynx.Data.Character.AminoAcid: Q :: AminoAcid
- ELynx.Data.Character.AminoAcid: R :: AminoAcid
- ELynx.Data.Character.AminoAcid: S :: AminoAcid
- ELynx.Data.Character.AminoAcid: T :: AminoAcid
- ELynx.Data.Character.AminoAcid: V :: AminoAcid
- ELynx.Data.Character.AminoAcid: W :: AminoAcid
- ELynx.Data.Character.AminoAcid: Y :: AminoAcid
- ELynx.Data.Character.AminoAcid: data AminoAcid
- ELynx.Data.Character.AminoAcid: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Classes.Eq ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Classes.Ord ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Enum.Bounded ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Enum.Enum ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Read.Read ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcid: instance GHC.Show.Show ELynx.Data.Character.AminoAcid.AminoAcid
- ELynx.Data.Character.AminoAcidI: A :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: B :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: C :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: D :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: E :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: F :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: G :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: Gap :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: H :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: I :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: J :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: K :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: L :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: M :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: N :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: P :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: Q :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: R :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: S :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: Stop :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: T :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: V :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: W :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: X :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: Y :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: Z :: AminoAcidI
- ELynx.Data.Character.AminoAcidI: data AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance ELynx.Data.Character.Character.CharacterI ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance ELynx.Data.Character.Character.CharacterX ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Classes.Eq ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Classes.Ord ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Enum.Bounded ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Enum.Enum ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Read.Read ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidI: instance GHC.Show.Show ELynx.Data.Character.AminoAcidI.AminoAcidI
- ELynx.Data.Character.AminoAcidS: A :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: C :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: D :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: E :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: F :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: G :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: Gap :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: H :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: I :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: K :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: L :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: M :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: N :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: P :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: Q :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: R :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: S :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: Stop :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: T :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: V :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: W :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: Y :: AminoAcidS
- ELynx.Data.Character.AminoAcidS: data AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance ELynx.Data.Character.Character.CharacterX ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Classes.Eq ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Classes.Ord ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Enum.Bounded ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Enum.Enum ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Read.Read ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidS: instance GHC.Show.Show ELynx.Data.Character.AminoAcidS.AminoAcidS
- ELynx.Data.Character.AminoAcidX: A :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: C :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: D :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: E :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: F :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: G :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: Gap :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: H :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: I :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: K :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: L :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: M :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: N :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: P :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: Q :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: R :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: S :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: T :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: V :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: W :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: Y :: AminoAcidX
- ELynx.Data.Character.AminoAcidX: data AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance ELynx.Data.Character.Character.CharacterX ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Classes.Eq ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Classes.Ord ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Enum.Bounded ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Enum.Enum ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Read.Read ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.AminoAcidX: instance GHC.Show.Show ELynx.Data.Character.AminoAcidX.AminoAcidX
- ELynx.Data.Character.Character: class (Show a, Read a, Eq a, Ord a, Enum a, Bounded a, Unbox a) => Character a
- ELynx.Data.Character.Character: class CharacterX a => CharacterI a
- ELynx.Data.Character.Character: class Character a => CharacterX a
- ELynx.Data.Character.Character: convert :: (Character a, Character b) => a -> b
- ELynx.Data.Character.Character: fromChar :: Character a => Char -> a
- ELynx.Data.Character.Character: fromString :: Character a => String -> [a]
- ELynx.Data.Character.Character: fromWord :: Character a => Word8 -> a
- ELynx.Data.Character.Character: gap :: CharacterX a => a
- ELynx.Data.Character.Character: isGap :: CharacterX a => a -> Bool
- ELynx.Data.Character.Character: isIUPAC :: CharacterI a => a -> Bool
- ELynx.Data.Character.Character: isStandard :: CharacterI a => a -> Bool
- ELynx.Data.Character.Character: isUnknown :: CharacterI a => a -> Bool
- ELynx.Data.Character.Character: iupac :: CharacterI a => [a]
- ELynx.Data.Character.Character: toChar :: Character a => a -> Char
- ELynx.Data.Character.Character: toStandard :: CharacterI a => a -> [a]
- ELynx.Data.Character.Character: toString :: Character a => [a] -> String
- ELynx.Data.Character.Character: toWord :: Character a => a -> Word8
- ELynx.Data.Character.Character: unknown :: CharacterI a => a
- ELynx.Data.Character.Codon: Codon :: (a, a, a) -> Codon a
- ELynx.Data.Character.Codon: Standard :: UniversalCode
- ELynx.Data.Character.Codon: VertebrateMitochondrial :: UniversalCode
- ELynx.Data.Character.Codon: data UniversalCode
- ELynx.Data.Character.Codon: fromVecUnsafe :: Vector v a => v a -> Codon a
- ELynx.Data.Character.Codon: instance Data.Aeson.Types.FromJSON.FromJSON ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance Data.Aeson.Types.ToJSON.ToJSON ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Classes.Eq ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Classes.Eq a => GHC.Classes.Eq (ELynx.Data.Character.Codon.Codon a)
- ELynx.Data.Character.Codon: instance GHC.Classes.Ord ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Classes.Ord a => GHC.Classes.Ord (ELynx.Data.Character.Codon.Codon a)
- ELynx.Data.Character.Codon: instance GHC.Enum.Bounded ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Enum.Enum ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Generics.Generic ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Read.Read ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Read.Read a => GHC.Read.Read (ELynx.Data.Character.Codon.Codon a)
- ELynx.Data.Character.Codon: instance GHC.Show.Show ELynx.Data.Character.Codon.UniversalCode
- ELynx.Data.Character.Codon: instance GHC.Show.Show a => GHC.Show.Show (ELynx.Data.Character.Codon.Codon a)
- ELynx.Data.Character.Codon: newtype Codon a
- ELynx.Data.Character.Codon: translate :: UniversalCode -> Codon Nucleotide -> AminoAcidS
- ELynx.Data.Character.Codon: translateI :: UniversalCode -> Codon NucleotideI -> AminoAcidI
- ELynx.Data.Character.Codon: translateX :: UniversalCode -> Codon NucleotideX -> AminoAcidS
- ELynx.Data.Character.Nucleotide: A :: Nucleotide
- ELynx.Data.Character.Nucleotide: C :: Nucleotide
- ELynx.Data.Character.Nucleotide: G :: Nucleotide
- ELynx.Data.Character.Nucleotide: T :: Nucleotide
- ELynx.Data.Character.Nucleotide: data Nucleotide
- ELynx.Data.Character.Nucleotide: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Classes.Eq ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Classes.Ord ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Enum.Bounded ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Enum.Enum ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Read.Read ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.Nucleotide: instance GHC.Show.Show ELynx.Data.Character.Nucleotide.Nucleotide
- ELynx.Data.Character.NucleotideI: A :: NucleotideI
- ELynx.Data.Character.NucleotideI: B :: NucleotideI
- ELynx.Data.Character.NucleotideI: C :: NucleotideI
- ELynx.Data.Character.NucleotideI: D :: NucleotideI
- ELynx.Data.Character.NucleotideI: G :: NucleotideI
- ELynx.Data.Character.NucleotideI: Gap :: NucleotideI
- ELynx.Data.Character.NucleotideI: H :: NucleotideI
- ELynx.Data.Character.NucleotideI: K :: NucleotideI
- ELynx.Data.Character.NucleotideI: M :: NucleotideI
- ELynx.Data.Character.NucleotideI: N :: NucleotideI
- ELynx.Data.Character.NucleotideI: R :: NucleotideI
- ELynx.Data.Character.NucleotideI: S :: NucleotideI
- ELynx.Data.Character.NucleotideI: T :: NucleotideI
- ELynx.Data.Character.NucleotideI: U :: NucleotideI
- ELynx.Data.Character.NucleotideI: V :: NucleotideI
- ELynx.Data.Character.NucleotideI: W :: NucleotideI
- ELynx.Data.Character.NucleotideI: Y :: NucleotideI
- ELynx.Data.Character.NucleotideI: data NucleotideI
- ELynx.Data.Character.NucleotideI: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance ELynx.Data.Character.Character.CharacterI ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance ELynx.Data.Character.Character.CharacterX ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Classes.Eq ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Classes.Ord ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Enum.Bounded ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Enum.Enum ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Read.Read ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideI: instance GHC.Show.Show ELynx.Data.Character.NucleotideI.NucleotideI
- ELynx.Data.Character.NucleotideX: A :: NucleotideX
- ELynx.Data.Character.NucleotideX: C :: NucleotideX
- ELynx.Data.Character.NucleotideX: G :: NucleotideX
- ELynx.Data.Character.NucleotideX: Gap :: NucleotideX
- ELynx.Data.Character.NucleotideX: T :: NucleotideX
- ELynx.Data.Character.NucleotideX: data NucleotideX
- ELynx.Data.Character.NucleotideX: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance Data.Vector.Unboxed.Base.Unbox ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance ELynx.Data.Character.Character.Character ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance ELynx.Data.Character.Character.CharacterX ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Classes.Eq ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Classes.Ord ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Enum.Bounded ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Enum.Enum ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Read.Read ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Character.NucleotideX: instance GHC.Show.Show ELynx.Data.Character.NucleotideX.NucleotideX
- ELynx.Data.Sequence.Alignment: Alignment :: [Name] -> [Description] -> Alphabet -> Matrix Character -> Alignment
- ELynx.Data.Sequence.Alignment: [alphabet] :: Alignment -> Alphabet
- ELynx.Data.Sequence.Alignment: [descriptions] :: Alignment -> [Description]
- ELynx.Data.Sequence.Alignment: [matrix] :: Alignment -> Matrix Character
- ELynx.Data.Sequence.Alignment: [names] :: Alignment -> [Name]
- ELynx.Data.Sequence.Alignment: concat :: Alignment -> Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: concatAlignments :: [Alignment] -> Alignment
- ELynx.Data.Sequence.Alignment: countGaps :: Alignment -> Int
- ELynx.Data.Sequence.Alignment: countIUPACChars :: Alignment -> Int
- ELynx.Data.Sequence.Alignment: countUnknowns :: Alignment -> Int
- ELynx.Data.Sequence.Alignment: data Alignment
- ELynx.Data.Sequence.Alignment: distribution :: FrequencyData -> [Double]
- ELynx.Data.Sequence.Alignment: filterColsConstant :: Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: filterColsConstantSoft :: Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: filterColsNoGaps :: Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: filterColsOnlyStd :: Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: filterColsStd :: Double -> Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: fromSequences :: [Sequence] -> Either String Alignment
- ELynx.Data.Sequence.Alignment: instance GHC.Classes.Eq ELynx.Data.Sequence.Alignment.Alignment
- ELynx.Data.Sequence.Alignment: instance GHC.Show.Show ELynx.Data.Sequence.Alignment.Alignment
- ELynx.Data.Sequence.Alignment: join :: Alignment -> Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: kEffEntropy :: FrequencyData -> [Double]
- ELynx.Data.Sequence.Alignment: kEffHomoplasy :: FrequencyData -> [Double]
- ELynx.Data.Sequence.Alignment: length :: Alignment -> Int
- ELynx.Data.Sequence.Alignment: nSequences :: Alignment -> Int
- ELynx.Data.Sequence.Alignment: randomSubSample :: PrimMonad m => Int -> Alignment -> Gen (PrimState m) -> m Alignment
- ELynx.Data.Sequence.Alignment: subSample :: [Int] -> Alignment -> Alignment
- ELynx.Data.Sequence.Alignment: summarize :: Alignment -> ByteString
- ELynx.Data.Sequence.Alignment: toFrequencyData :: Alignment -> FrequencyData
- ELynx.Data.Sequence.Alignment: toSequences :: Alignment -> [Sequence]
- ELynx.Data.Sequence.Alignment: type FrequencyData = Matrix Double
- ELynx.Data.Sequence.Defaults: fieldWidth :: Int
- ELynx.Data.Sequence.Defaults: nameWidth :: Int
- ELynx.Data.Sequence.Defaults: summaryLength :: Int
- ELynx.Data.Sequence.Defaults: summaryNSequences :: Int
- ELynx.Data.Sequence.Distance: hamming :: Sequence -> Sequence -> Either String Int
- ELynx.Data.Sequence.Sequence: Sequence :: Name -> Description -> Alphabet -> Characters -> Sequence
- ELynx.Data.Sequence.Sequence: [alphabet] :: Sequence -> Alphabet
- ELynx.Data.Sequence.Sequence: [characters] :: Sequence -> Characters
- ELynx.Data.Sequence.Sequence: [description] :: Sequence -> Description
- ELynx.Data.Sequence.Sequence: [name] :: Sequence -> Name
- ELynx.Data.Sequence.Sequence: body :: [Sequence] -> ByteString
- ELynx.Data.Sequence.Sequence: concat :: Sequence -> Sequence -> Sequence
- ELynx.Data.Sequence.Sequence: concatSequences :: [[Sequence]] -> [Sequence]
- ELynx.Data.Sequence.Sequence: data Sequence
- ELynx.Data.Sequence.Sequence: equalLength :: [Sequence] -> Bool
- ELynx.Data.Sequence.Sequence: filterLongerThan :: Int -> [Sequence] -> [Sequence]
- ELynx.Data.Sequence.Sequence: filterShorterThan :: Int -> [Sequence] -> [Sequence]
- ELynx.Data.Sequence.Sequence: filterStandard :: [Sequence] -> [Sequence]
- ELynx.Data.Sequence.Sequence: fromByteString :: ByteString -> Characters
- ELynx.Data.Sequence.Sequence: header :: [Sequence] -> ByteString
- ELynx.Data.Sequence.Sequence: instance GHC.Classes.Eq ELynx.Data.Sequence.Sequence.Sequence
- ELynx.Data.Sequence.Sequence: instance GHC.Show.Show ELynx.Data.Sequence.Sequence.Sequence
- ELynx.Data.Sequence.Sequence: length :: Sequence -> Int
- ELynx.Data.Sequence.Sequence: longest :: [Sequence] -> Sequence
- ELynx.Data.Sequence.Sequence: summarize :: Sequence -> ByteString
- ELynx.Data.Sequence.Sequence: summarizeSequences :: [Sequence] -> ByteString
- ELynx.Data.Sequence.Sequence: toByteString :: Characters -> ByteString
- ELynx.Data.Sequence.Sequence: trim :: Int -> Sequence -> Sequence
- ELynx.Data.Sequence.Sequence: type Characters = Vector Character
- ELynx.Data.Sequence.Sequence: type Description = ByteString
- ELynx.Data.Sequence.Sequence: type Name = ByteString
- ELynx.Data.Sequence.Translate: translateSeq :: UniversalCode -> Int -> Sequence -> Sequence
- ELynx.Export.Sequence.Fasta: sequenceToFasta :: Sequence -> ByteString
- ELynx.Export.Sequence.Fasta: sequencesToFasta :: [Sequence] -> ByteString
- ELynx.Import.Sequence.Fasta: fasta :: Alphabet -> Parser [Sequence]
- ELynx.Import.Sequence.Fasta: fastaSequence :: Alphabet -> Parser Sequence
+ ELynx.Alphabet.Alphabet: AlphabetSpec :: !Set Character -> !Set Character -> !Set Character -> !Set Character -> !Set Character -> (Character -> [Character]) -> AlphabetSpec
+ ELynx.Alphabet.Alphabet: DNA :: Alphabet
+ ELynx.Alphabet.Alphabet: DNAI :: Alphabet
+ ELynx.Alphabet.Alphabet: DNAX :: Alphabet
+ ELynx.Alphabet.Alphabet: Protein :: Alphabet
+ ELynx.Alphabet.Alphabet: ProteinI :: Alphabet
+ ELynx.Alphabet.Alphabet: ProteinS :: Alphabet
+ ELynx.Alphabet.Alphabet: ProteinX :: Alphabet
+ ELynx.Alphabet.Alphabet: [all] :: AlphabetSpec -> !Set Character
+ ELynx.Alphabet.Alphabet: [gap] :: AlphabetSpec -> !Set Character
+ ELynx.Alphabet.Alphabet: [iupac] :: AlphabetSpec -> !Set Character
+ ELynx.Alphabet.Alphabet: [std] :: AlphabetSpec -> !Set Character
+ ELynx.Alphabet.Alphabet: [toStd] :: AlphabetSpec -> Character -> [Character]
+ ELynx.Alphabet.Alphabet: [unknown] :: AlphabetSpec -> !Set Character
+ ELynx.Alphabet.Alphabet: alphabetDescription :: Alphabet -> String
+ ELynx.Alphabet.Alphabet: alphabetSpec :: Alphabet -> AlphabetSpec
+ ELynx.Alphabet.Alphabet: data Alphabet
+ ELynx.Alphabet.Alphabet: data AlphabetSpec
+ ELynx.Alphabet.Alphabet: instance Data.Aeson.Types.FromJSON.FromJSON ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance Data.Aeson.Types.ToJSON.ToJSON ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Classes.Eq ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Classes.Ord ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Enum.Bounded ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Enum.Enum ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Generics.Generic ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Read.Read ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: instance GHC.Show.Show ELynx.Alphabet.Alphabet.Alphabet
+ ELynx.Alphabet.Alphabet: isGap :: Alphabet -> Character -> Bool
+ ELynx.Alphabet.Alphabet: isIUPAC :: Alphabet -> Character -> Bool
+ ELynx.Alphabet.Alphabet: isMember :: Alphabet -> Character -> Bool
+ ELynx.Alphabet.Alphabet: isStd :: Alphabet -> Character -> Bool
+ ELynx.Alphabet.Alphabet: isUnknown :: Alphabet -> Character -> Bool
+ ELynx.Alphabet.Character: data Character
+ ELynx.Alphabet.Character: fromCVec :: Character a => Vector a -> Vector Character
+ ELynx.Alphabet.Character: fromChar :: Char -> Character
+ ELynx.Alphabet.Character: fromString :: String -> [Character]
+ ELynx.Alphabet.Character: fromWord :: Word8 -> Character
+ ELynx.Alphabet.Character: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance Data.Vector.Unboxed.Base.Unbox ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance GHC.Classes.Eq ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance GHC.Classes.Ord ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance GHC.Enum.Bounded ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance GHC.Read.Read ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: instance GHC.Show.Show ELynx.Alphabet.Character.Character
+ ELynx.Alphabet.Character: toCVec :: Character a => Vector Character -> Vector a
+ ELynx.Alphabet.Character: toChar :: Character -> Char
+ ELynx.Alphabet.Character: toString :: [Character] -> String
+ ELynx.Alphabet.Character: toWord :: Character -> Word8
+ ELynx.Alphabet.DistributionDiversity: entropy :: Vector v Double => v Double -> Double
+ ELynx.Alphabet.DistributionDiversity: frequencyCharacters :: (Vector v Character, Vector v Int, Vector v Double) => AlphabetSpec -> v Character -> v Double
+ ELynx.Alphabet.DistributionDiversity: homoplasy :: Vector v Double => v Double -> Double
+ ELynx.Alphabet.DistributionDiversity: kEffEntropy :: Vector v Double => v Double -> Double
+ ELynx.Alphabet.DistributionDiversity: kEffHomoplasy :: Vector v Double => v Double -> Double
+ ELynx.Character.AminoAcid: A :: AminoAcid
+ ELynx.Character.AminoAcid: C :: AminoAcid
+ ELynx.Character.AminoAcid: D :: AminoAcid
+ ELynx.Character.AminoAcid: E :: AminoAcid
+ ELynx.Character.AminoAcid: F :: AminoAcid
+ ELynx.Character.AminoAcid: G :: AminoAcid
+ ELynx.Character.AminoAcid: H :: AminoAcid
+ ELynx.Character.AminoAcid: I :: AminoAcid
+ ELynx.Character.AminoAcid: K :: AminoAcid
+ ELynx.Character.AminoAcid: L :: AminoAcid
+ ELynx.Character.AminoAcid: M :: AminoAcid
+ ELynx.Character.AminoAcid: N :: AminoAcid
+ ELynx.Character.AminoAcid: P :: AminoAcid
+ ELynx.Character.AminoAcid: Q :: AminoAcid
+ ELynx.Character.AminoAcid: R :: AminoAcid
+ ELynx.Character.AminoAcid: S :: AminoAcid
+ ELynx.Character.AminoAcid: T :: AminoAcid
+ ELynx.Character.AminoAcid: V :: AminoAcid
+ ELynx.Character.AminoAcid: W :: AminoAcid
+ ELynx.Character.AminoAcid: Y :: AminoAcid
+ ELynx.Character.AminoAcid: data AminoAcid
+ ELynx.Character.AminoAcid: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance ELynx.Character.Character.Character ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Classes.Eq ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Classes.Ord ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Enum.Bounded ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Enum.Enum ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Read.Read ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcid: instance GHC.Show.Show ELynx.Character.AminoAcid.AminoAcid
+ ELynx.Character.AminoAcidI: A :: AminoAcidI
+ ELynx.Character.AminoAcidI: B :: AminoAcidI
+ ELynx.Character.AminoAcidI: C :: AminoAcidI
+ ELynx.Character.AminoAcidI: D :: AminoAcidI
+ ELynx.Character.AminoAcidI: E :: AminoAcidI
+ ELynx.Character.AminoAcidI: F :: AminoAcidI
+ ELynx.Character.AminoAcidI: G :: AminoAcidI
+ ELynx.Character.AminoAcidI: Gap :: AminoAcidI
+ ELynx.Character.AminoAcidI: H :: AminoAcidI
+ ELynx.Character.AminoAcidI: I :: AminoAcidI
+ ELynx.Character.AminoAcidI: J :: AminoAcidI
+ ELynx.Character.AminoAcidI: K :: AminoAcidI
+ ELynx.Character.AminoAcidI: L :: AminoAcidI
+ ELynx.Character.AminoAcidI: M :: AminoAcidI
+ ELynx.Character.AminoAcidI: N :: AminoAcidI
+ ELynx.Character.AminoAcidI: P :: AminoAcidI
+ ELynx.Character.AminoAcidI: Q :: AminoAcidI
+ ELynx.Character.AminoAcidI: R :: AminoAcidI
+ ELynx.Character.AminoAcidI: S :: AminoAcidI
+ ELynx.Character.AminoAcidI: Stop :: AminoAcidI
+ ELynx.Character.AminoAcidI: T :: AminoAcidI
+ ELynx.Character.AminoAcidI: V :: AminoAcidI
+ ELynx.Character.AminoAcidI: W :: AminoAcidI
+ ELynx.Character.AminoAcidI: X :: AminoAcidI
+ ELynx.Character.AminoAcidI: Y :: AminoAcidI
+ ELynx.Character.AminoAcidI: Z :: AminoAcidI
+ ELynx.Character.AminoAcidI: data AminoAcidI
+ ELynx.Character.AminoAcidI: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance ELynx.Character.Character.Character ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance ELynx.Character.Character.CharacterI ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance ELynx.Character.Character.CharacterX ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Classes.Eq ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Classes.Ord ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Enum.Bounded ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Enum.Enum ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Read.Read ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidI: instance GHC.Show.Show ELynx.Character.AminoAcidI.AminoAcidI
+ ELynx.Character.AminoAcidS: A :: AminoAcidS
+ ELynx.Character.AminoAcidS: C :: AminoAcidS
+ ELynx.Character.AminoAcidS: D :: AminoAcidS
+ ELynx.Character.AminoAcidS: E :: AminoAcidS
+ ELynx.Character.AminoAcidS: F :: AminoAcidS
+ ELynx.Character.AminoAcidS: G :: AminoAcidS
+ ELynx.Character.AminoAcidS: Gap :: AminoAcidS
+ ELynx.Character.AminoAcidS: H :: AminoAcidS
+ ELynx.Character.AminoAcidS: I :: AminoAcidS
+ ELynx.Character.AminoAcidS: K :: AminoAcidS
+ ELynx.Character.AminoAcidS: L :: AminoAcidS
+ ELynx.Character.AminoAcidS: M :: AminoAcidS
+ ELynx.Character.AminoAcidS: N :: AminoAcidS
+ ELynx.Character.AminoAcidS: P :: AminoAcidS
+ ELynx.Character.AminoAcidS: Q :: AminoAcidS
+ ELynx.Character.AminoAcidS: R :: AminoAcidS
+ ELynx.Character.AminoAcidS: S :: AminoAcidS
+ ELynx.Character.AminoAcidS: Stop :: AminoAcidS
+ ELynx.Character.AminoAcidS: T :: AminoAcidS
+ ELynx.Character.AminoAcidS: V :: AminoAcidS
+ ELynx.Character.AminoAcidS: W :: AminoAcidS
+ ELynx.Character.AminoAcidS: Y :: AminoAcidS
+ ELynx.Character.AminoAcidS: data AminoAcidS
+ ELynx.Character.AminoAcidS: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance ELynx.Character.Character.Character ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance ELynx.Character.Character.CharacterX ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Classes.Eq ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Classes.Ord ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Enum.Bounded ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Enum.Enum ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Read.Read ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidS: instance GHC.Show.Show ELynx.Character.AminoAcidS.AminoAcidS
+ ELynx.Character.AminoAcidX: A :: AminoAcidX
+ ELynx.Character.AminoAcidX: C :: AminoAcidX
+ ELynx.Character.AminoAcidX: D :: AminoAcidX
+ ELynx.Character.AminoAcidX: E :: AminoAcidX
+ ELynx.Character.AminoAcidX: F :: AminoAcidX
+ ELynx.Character.AminoAcidX: G :: AminoAcidX
+ ELynx.Character.AminoAcidX: Gap :: AminoAcidX
+ ELynx.Character.AminoAcidX: H :: AminoAcidX
+ ELynx.Character.AminoAcidX: I :: AminoAcidX
+ ELynx.Character.AminoAcidX: K :: AminoAcidX
+ ELynx.Character.AminoAcidX: L :: AminoAcidX
+ ELynx.Character.AminoAcidX: M :: AminoAcidX
+ ELynx.Character.AminoAcidX: N :: AminoAcidX
+ ELynx.Character.AminoAcidX: P :: AminoAcidX
+ ELynx.Character.AminoAcidX: Q :: AminoAcidX
+ ELynx.Character.AminoAcidX: R :: AminoAcidX
+ ELynx.Character.AminoAcidX: S :: AminoAcidX
+ ELynx.Character.AminoAcidX: T :: AminoAcidX
+ ELynx.Character.AminoAcidX: V :: AminoAcidX
+ ELynx.Character.AminoAcidX: W :: AminoAcidX
+ ELynx.Character.AminoAcidX: Y :: AminoAcidX
+ ELynx.Character.AminoAcidX: data AminoAcidX
+ ELynx.Character.AminoAcidX: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance ELynx.Character.Character.Character ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance ELynx.Character.Character.CharacterX ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Classes.Eq ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Classes.Ord ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Enum.Bounded ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Enum.Enum ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Read.Read ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.AminoAcidX: instance GHC.Show.Show ELynx.Character.AminoAcidX.AminoAcidX
+ ELynx.Character.Character: class (Show a, Read a, Eq a, Ord a, Enum a, Bounded a, Unbox a) => Character a
+ ELynx.Character.Character: class CharacterX a => CharacterI a
+ ELynx.Character.Character: class Character a => CharacterX a
+ ELynx.Character.Character: convert :: (Character a, Character b) => a -> b
+ ELynx.Character.Character: fromChar :: Character a => Char -> a
+ ELynx.Character.Character: fromString :: Character a => String -> [a]
+ ELynx.Character.Character: fromWord :: Character a => Word8 -> a
+ ELynx.Character.Character: gap :: CharacterX a => a
+ ELynx.Character.Character: isGap :: CharacterX a => a -> Bool
+ ELynx.Character.Character: isIUPAC :: CharacterI a => a -> Bool
+ ELynx.Character.Character: isStandard :: CharacterI a => a -> Bool
+ ELynx.Character.Character: isUnknown :: CharacterI a => a -> Bool
+ ELynx.Character.Character: iupac :: CharacterI a => [a]
+ ELynx.Character.Character: toChar :: Character a => a -> Char
+ ELynx.Character.Character: toStandard :: CharacterI a => a -> [a]
+ ELynx.Character.Character: toString :: Character a => [a] -> String
+ ELynx.Character.Character: toWord :: Character a => a -> Word8
+ ELynx.Character.Character: unknown :: CharacterI a => a
+ ELynx.Character.Codon: Codon :: (a, a, a) -> Codon a
+ ELynx.Character.Codon: Standard :: UniversalCode
+ ELynx.Character.Codon: VertebrateMitochondrial :: UniversalCode
+ ELynx.Character.Codon: data UniversalCode
+ ELynx.Character.Codon: fromVecUnsafe :: Vector v a => v a -> Codon a
+ ELynx.Character.Codon: instance Data.Aeson.Types.FromJSON.FromJSON ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance Data.Aeson.Types.ToJSON.ToJSON ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Classes.Eq ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Classes.Eq a => GHC.Classes.Eq (ELynx.Character.Codon.Codon a)
+ ELynx.Character.Codon: instance GHC.Classes.Ord ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Classes.Ord a => GHC.Classes.Ord (ELynx.Character.Codon.Codon a)
+ ELynx.Character.Codon: instance GHC.Enum.Bounded ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Enum.Enum ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Generics.Generic ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Read.Read ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Read.Read a => GHC.Read.Read (ELynx.Character.Codon.Codon a)
+ ELynx.Character.Codon: instance GHC.Show.Show ELynx.Character.Codon.UniversalCode
+ ELynx.Character.Codon: instance GHC.Show.Show a => GHC.Show.Show (ELynx.Character.Codon.Codon a)
+ ELynx.Character.Codon: newtype Codon a
+ ELynx.Character.Codon: translate :: UniversalCode -> Codon Nucleotide -> AminoAcidS
+ ELynx.Character.Codon: translateI :: UniversalCode -> Codon NucleotideI -> AminoAcidI
+ ELynx.Character.Codon: translateX :: UniversalCode -> Codon NucleotideX -> AminoAcidS
+ ELynx.Character.Nucleotide: A :: Nucleotide
+ ELynx.Character.Nucleotide: C :: Nucleotide
+ ELynx.Character.Nucleotide: G :: Nucleotide
+ ELynx.Character.Nucleotide: T :: Nucleotide
+ ELynx.Character.Nucleotide: data Nucleotide
+ ELynx.Character.Nucleotide: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance ELynx.Character.Character.Character ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Classes.Eq ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Classes.Ord ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Enum.Bounded ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Enum.Enum ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Read.Read ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.Nucleotide: instance GHC.Show.Show ELynx.Character.Nucleotide.Nucleotide
+ ELynx.Character.NucleotideI: A :: NucleotideI
+ ELynx.Character.NucleotideI: B :: NucleotideI
+ ELynx.Character.NucleotideI: C :: NucleotideI
+ ELynx.Character.NucleotideI: D :: NucleotideI
+ ELynx.Character.NucleotideI: G :: NucleotideI
+ ELynx.Character.NucleotideI: Gap :: NucleotideI
+ ELynx.Character.NucleotideI: H :: NucleotideI
+ ELynx.Character.NucleotideI: K :: NucleotideI
+ ELynx.Character.NucleotideI: M :: NucleotideI
+ ELynx.Character.NucleotideI: N :: NucleotideI
+ ELynx.Character.NucleotideI: R :: NucleotideI
+ ELynx.Character.NucleotideI: S :: NucleotideI
+ ELynx.Character.NucleotideI: T :: NucleotideI
+ ELynx.Character.NucleotideI: U :: NucleotideI
+ ELynx.Character.NucleotideI: V :: NucleotideI
+ ELynx.Character.NucleotideI: W :: NucleotideI
+ ELynx.Character.NucleotideI: Y :: NucleotideI
+ ELynx.Character.NucleotideI: data NucleotideI
+ ELynx.Character.NucleotideI: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance ELynx.Character.Character.Character ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance ELynx.Character.Character.CharacterI ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance ELynx.Character.Character.CharacterX ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Classes.Eq ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Classes.Ord ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Enum.Bounded ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Enum.Enum ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Read.Read ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideI: instance GHC.Show.Show ELynx.Character.NucleotideI.NucleotideI
+ ELynx.Character.NucleotideX: A :: NucleotideX
+ ELynx.Character.NucleotideX: C :: NucleotideX
+ ELynx.Character.NucleotideX: G :: NucleotideX
+ ELynx.Character.NucleotideX: Gap :: NucleotideX
+ ELynx.Character.NucleotideX: T :: NucleotideX
+ ELynx.Character.NucleotideX: data NucleotideX
+ ELynx.Character.NucleotideX: instance Data.Vector.Generic.Base.Vector Data.Vector.Unboxed.Base.Vector ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance Data.Vector.Generic.Mutable.Base.MVector Data.Vector.Unboxed.Base.MVector ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance Data.Vector.Unboxed.Base.Unbox ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance ELynx.Character.Character.Character ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance ELynx.Character.Character.CharacterX ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Classes.Eq ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Classes.Ord ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Enum.Bounded ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Enum.Enum ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Read.Read ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Character.NucleotideX: instance GHC.Show.Show ELynx.Character.NucleotideX.NucleotideX
+ ELynx.Sequence.Alignment: Alignment :: [Name] -> [Description] -> Alphabet -> Matrix Character -> Alignment
+ ELynx.Sequence.Alignment: [alphabet] :: Alignment -> Alphabet
+ ELynx.Sequence.Alignment: [descriptions] :: Alignment -> [Description]
+ ELynx.Sequence.Alignment: [matrix] :: Alignment -> Matrix Character
+ ELynx.Sequence.Alignment: [names] :: Alignment -> [Name]
+ ELynx.Sequence.Alignment: concat :: Alignment -> Alignment -> Alignment
+ ELynx.Sequence.Alignment: concatAlignments :: [Alignment] -> Alignment
+ ELynx.Sequence.Alignment: countGaps :: Alignment -> Int
+ ELynx.Sequence.Alignment: countIUPACChars :: Alignment -> Int
+ ELynx.Sequence.Alignment: countUnknowns :: Alignment -> Int
+ ELynx.Sequence.Alignment: data Alignment
+ ELynx.Sequence.Alignment: distribution :: FrequencyData -> [Double]
+ ELynx.Sequence.Alignment: filterColsConstant :: Alignment -> Alignment
+ ELynx.Sequence.Alignment: filterColsConstantSoft :: Alignment -> Alignment
+ ELynx.Sequence.Alignment: filterColsNoGaps :: Alignment -> Alignment
+ ELynx.Sequence.Alignment: filterColsOnlyStd :: Alignment -> Alignment
+ ELynx.Sequence.Alignment: filterColsStd :: Double -> Alignment -> Alignment
+ ELynx.Sequence.Alignment: fromSequences :: [Sequence] -> Either String Alignment
+ ELynx.Sequence.Alignment: instance GHC.Classes.Eq ELynx.Sequence.Alignment.Alignment
+ ELynx.Sequence.Alignment: instance GHC.Show.Show ELynx.Sequence.Alignment.Alignment
+ ELynx.Sequence.Alignment: join :: Alignment -> Alignment -> Alignment
+ ELynx.Sequence.Alignment: kEffEntropy :: FrequencyData -> [Double]
+ ELynx.Sequence.Alignment: kEffHomoplasy :: FrequencyData -> [Double]
+ ELynx.Sequence.Alignment: length :: Alignment -> Int
+ ELynx.Sequence.Alignment: nSequences :: Alignment -> Int
+ ELynx.Sequence.Alignment: randomSubSample :: PrimMonad m => Int -> Alignment -> Gen (PrimState m) -> m Alignment
+ ELynx.Sequence.Alignment: subSample :: [Int] -> Alignment -> Alignment
+ ELynx.Sequence.Alignment: summarize :: Alignment -> ByteString
+ ELynx.Sequence.Alignment: toFrequencyData :: Alignment -> FrequencyData
+ ELynx.Sequence.Alignment: toSequences :: Alignment -> [Sequence]
+ ELynx.Sequence.Alignment: type FrequencyData = Matrix Double
+ ELynx.Sequence.Defaults: fieldWidth :: Int
+ ELynx.Sequence.Defaults: nameWidth :: Int
+ ELynx.Sequence.Defaults: summaryLength :: Int
+ ELynx.Sequence.Defaults: summaryNSequences :: Int
+ ELynx.Sequence.Distance: hamming :: Sequence -> Sequence -> Either String Int
+ ELynx.Sequence.Export.Fasta: sequenceToFasta :: Sequence -> ByteString
+ ELynx.Sequence.Export.Fasta: sequencesToFasta :: [Sequence] -> ByteString
+ ELynx.Sequence.Import.Fasta: fasta :: Alphabet -> Parser [Sequence]
+ ELynx.Sequence.Import.Fasta: fastaSequence :: Alphabet -> Parser Sequence
+ ELynx.Sequence.Sequence: Sequence :: Name -> Description -> Alphabet -> Characters -> Sequence
+ ELynx.Sequence.Sequence: [alphabet] :: Sequence -> Alphabet
+ ELynx.Sequence.Sequence: [characters] :: Sequence -> Characters
+ ELynx.Sequence.Sequence: [description] :: Sequence -> Description
+ ELynx.Sequence.Sequence: [name] :: Sequence -> Name
+ ELynx.Sequence.Sequence: body :: [Sequence] -> ByteString
+ ELynx.Sequence.Sequence: concat :: Sequence -> Sequence -> Sequence
+ ELynx.Sequence.Sequence: concatSequences :: [[Sequence]] -> [Sequence]
+ ELynx.Sequence.Sequence: data Sequence
+ ELynx.Sequence.Sequence: equalLength :: [Sequence] -> Bool
+ ELynx.Sequence.Sequence: filterLongerThan :: Int -> [Sequence] -> [Sequence]
+ ELynx.Sequence.Sequence: filterShorterThan :: Int -> [Sequence] -> [Sequence]
+ ELynx.Sequence.Sequence: filterStandard :: [Sequence] -> [Sequence]
+ ELynx.Sequence.Sequence: fromByteString :: ByteString -> Characters
+ ELynx.Sequence.Sequence: header :: [Sequence] -> ByteString
+ ELynx.Sequence.Sequence: instance GHC.Classes.Eq ELynx.Sequence.Sequence.Sequence
+ ELynx.Sequence.Sequence: instance GHC.Show.Show ELynx.Sequence.Sequence.Sequence
+ ELynx.Sequence.Sequence: length :: Sequence -> Int
+ ELynx.Sequence.Sequence: longest :: [Sequence] -> Sequence
+ ELynx.Sequence.Sequence: summarize :: Sequence -> ByteString
+ ELynx.Sequence.Sequence: summarizeSequences :: [Sequence] -> ByteString
+ ELynx.Sequence.Sequence: toByteString :: Characters -> ByteString
+ ELynx.Sequence.Sequence: trim :: Int -> Sequence -> Sequence
+ ELynx.Sequence.Sequence: type Characters = Vector Character
+ ELynx.Sequence.Sequence: type Description = ByteString
+ ELynx.Sequence.Sequence: type Name = ByteString
+ ELynx.Sequence.Translate: translateSeq :: UniversalCode -> Int -> Sequence -> Sequence

Files

ChangeLog.md view
@@ -5,6 +5,13 @@ ## Unreleased changes  +## Version 0.6.1.1++-   Remove plotting functionality (gnuplot incompatible with ghc921).+-   Read files strictly.+-   Refactor; flatten model hierarchy.++ ## Version 0.6.1.0  -   Split `ELynx.Tools` into separate modules because the package will be reduced.
README.md view
@@ -2,7 +2,7 @@  # The ELynx Suite -Version: 0.6.0.0.+Version: 0.6.1.1. Reproducible evolution made easy.  <p align="center"><img src="https://travis-ci.org/dschrempf/elynx.svg?branch=master"/></p>@@ -69,15 +69,16 @@  # Get help -    cabal exec slynx -- --help+    cabal run slynx -- --help     # OR: stack exec slynx -- --help     # OR: slynx --help -    ELynx Suite version 0.6.0.0.+    Up to date+    ELynx Suite version 0.6.1.1.     Developed by Dominik Schrempf.-    Compiled on September 4, 2021, at 12:58 pm, UTC.+    Compiled on February 22, 2022, at 15:10 pm, UTC.     -    Usage: slynx [-v|--verbosity VALUE] [-o|--output-file-basename NAME] +    Usage: slynx [-v|--verbosity VALUE] [-o|--output-file-basename NAME]                  [-f|--force] [--no-elynx-file] COMMAND       Analyze, and simulate multi sequence alignments.     @@ -138,18 +139,19 @@  The documentation of sub commands can be accessed separately: -    cabal exec slynx -- simulate --help+    cabal run slynx -- simulate --help     # OR: stack exec slynx -- simulate --help     # OR: slynx simulate --help -    ELynx Suite version 0.6.0.0.+    Up to date+    ELynx Suite version 0.6.1.1.     Developed by Dominik Schrempf.-    Compiled on September 4, 2021, at 12:58 pm, UTC.+    Compiled on February 22, 2022, at 15:10 pm, UTC.     -    Usage: slynx simulate (-t|--tree-file Name) [-s|--substitution-model MODEL] -                          [-m|--mixture-model MODEL] [-e|--edm-file NAME] -                          [-p|--siteprofile-files NAMES] -                          [-w|--mixture-model-weights "[DOUBLE,DOUBLE,...]"] +    Usage: slynx simulate (-t|--tree-file Name) [-s|--substitution-model MODEL]+                          [-m|--mixture-model MODEL] [-e|--edm-file NAME]+                          [-p|--siteprofile-files NAMES]+                          [-w|--mixture-model-weights "[DOUBLE,DOUBLE,...]"]                           [-g|--gamma-rate-heterogeneity "(NCAT,SHAPE)"]                           (-l|--length NUMBER) [-S|--seed [INT]]       Simulate multi sequence alignments.
elynx-seq.cabal view
@@ -1,6 +1,6 @@-cabal-version:  2.2+cabal-version:  3.0 name:           elynx-seq-version:        0.6.1.0+version:        0.6.1.1 synopsis:       Handle molecular sequences description:    Examine, modify, and simulate molecular sequences in a reproducible way. Please see the README on GitHub at <https://github.com/dschrempf/elynx>. category:       Bioinformatics@@ -31,25 +31,25 @@  library   exposed-modules:-      ELynx.Data.Alphabet.Alphabet-      ELynx.Data.Alphabet.Character-      ELynx.Data.Alphabet.DistributionDiversity-      ELynx.Data.Character.AminoAcid-      ELynx.Data.Character.AminoAcidI-      ELynx.Data.Character.AminoAcidS-      ELynx.Data.Character.AminoAcidX-      ELynx.Data.Character.Character-      ELynx.Data.Character.Codon-      ELynx.Data.Character.Nucleotide-      ELynx.Data.Character.NucleotideI-      ELynx.Data.Character.NucleotideX-      ELynx.Data.Sequence.Alignment-      ELynx.Data.Sequence.Defaults-      ELynx.Data.Sequence.Distance-      ELynx.Data.Sequence.Sequence-      ELynx.Data.Sequence.Translate-      ELynx.Export.Sequence.Fasta-      ELynx.Import.Sequence.Fasta+      ELynx.Alphabet.Alphabet+      ELynx.Alphabet.Character+      ELynx.Alphabet.DistributionDiversity+      ELynx.Character.AminoAcid+      ELynx.Character.AminoAcidI+      ELynx.Character.AminoAcidS+      ELynx.Character.AminoAcidX+      ELynx.Character.Character+      ELynx.Character.Codon+      ELynx.Character.Nucleotide+      ELynx.Character.NucleotideI+      ELynx.Character.NucleotideX+      ELynx.Sequence.Alignment+      ELynx.Sequence.Defaults+      ELynx.Sequence.Distance+      ELynx.Sequence.Sequence+      ELynx.Sequence.Translate+      ELynx.Sequence.Export.Fasta+      ELynx.Sequence.Import.Fasta   other-modules:       Paths_elynx_seq   autogen-modules:@@ -75,12 +75,12 @@   type: exitcode-stdio-1.0   main-is: Spec.hs   other-modules:-      ELynx.Data.Alphabet.DistributionDiversitySpec-      ELynx.Data.Sequence.AlignmentSpec-      ELynx.Data.Sequence.SequenceSpec-      ELynx.Data.Sequence.TranslateSpec-      ELynx.Export.Sequence.FastaSpec-      ELynx.Import.Sequence.FastaSpec+      ELynx.Alphabet.DistributionDiversitySpec+      ELynx.Sequence.AlignmentSpec+      ELynx.Sequence.SequenceSpec+      ELynx.Sequence.TranslateSpec+      ELynx.Sequence.Export.FastaSpec+      ELynx.Sequence.Import.FastaSpec       Paths_elynx_seq   autogen-modules:       Paths_elynx_seq
+ src/ELynx/Alphabet/Alphabet.hs view
@@ -0,0 +1,307 @@+{-# LANGUAGE DeriveGeneric #-}++-- |+-- Module      :  ELynx.Alphabet.Alphabet+-- Description :  Alphabets store hereditary information+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+--+-- Portability :  portable+--+-- Creation date: Fri May 10 11:10:32 2019.+--+-- Hierarchy:+--+-- 1. 'Character' type.+--+-- 2. Sets of 'Character's form 'Alphabet's; each 'Alphabet' has a specification+-- 'AlphabetSpec'.+--+-- New alphabets have to be added manually to this module.+--+-- This way of handling characters and alphabets IS NOT TYPE SAFE, but much, much+-- faster. A second layer of modules such as 'ELynx.Character.Nucleotide'+-- depend on a 'ELynx.Character.Character.Character' type class. Hence, they+-- provide a type safe way of handling alphabets. Conversion is possible, for+-- instance, with 'ELynx.Alphabet.Character.fromCVec', and+-- 'ELynx.Alphabet.Character.toCVec'.+module ELynx.Alphabet.Alphabet+  ( Alphabet (..),+    AlphabetSpec (..),+    alphabetSpec,+    alphabetDescription,+    isStd,+    isGap,+    isUnknown,+    isIUPAC,+    isMember,+  )+where++import Data.Aeson+  ( FromJSON,+    ToJSON,+  )+import qualified Data.Set as S+import ELynx.Alphabet.Character+import GHC.Generics (Generic)+import Prelude hiding (all)++-- | Available alphabets; for details see 'alphabetSpec'.+data Alphabet+  = DNA+  | DNAX+  | DNAI+  | Protein+  | ProteinX+  | ProteinS+  | ProteinI+  deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic)++instance FromJSON Alphabet++instance ToJSON Alphabet++-- | Verbose alphabet name.+alphabetDescription :: Alphabet -> String+alphabetDescription DNA = "DNA (nucleotides)"+alphabetDescription DNAX = "DNAX (nucleotides; including gaps)"+alphabetDescription DNAI = "DNAI (nucleotides; including gaps, and IUPAC codes)"+alphabetDescription Protein = "Protein (amino acids)"+alphabetDescription ProteinX = "ProteinX (amino acids; including gaps)"+alphabetDescription ProteinS = "ProteinS (amino acids; including gaps, and translation stops)"+alphabetDescription ProteinI = "ProteinI (amino acids; including gaps, translation stops, and IUPAC codes)"++-- | Alphabet specification. 'S.Set' is used because it provides fast lookups.+data AlphabetSpec = AlphabetSpec+  { -- | Standard characters.+    std :: !(S.Set Character),+    -- | Gap characters.+    gap :: !(S.Set Character),+    -- | Unknown characters.+    unknown :: !(S.Set Character),+    -- | Other IUPAC codes.+    iupac :: !(S.Set Character),+    -- | All characters in the alphabet.+    all :: !(S.Set Character),+    -- | Convert from IUPAC to the corresponding standard characters.+    toStd :: Character -> [Character]+  }++-- Create alphabet spec.+fromChars ::+  String -> String -> String -> String -> (Char -> String) -> AlphabetSpec+fromChars st ga un iu to =+  AlphabetSpec+    st'+    ga'+    un'+    iu'+    al+    (fromString . to . toChar)+  where+    st' = S.fromList $ fromString st+    ga' = S.fromList $ fromString ga+    un' = S.fromList $ fromString un+    iu' = S.fromList $ fromString iu+    al = S.unions [st', ga', un', iu']++-- | Get the alphabet specification for a given alphabet.+alphabetSpec :: Alphabet -> AlphabetSpec+alphabetSpec DNA = dna+alphabetSpec DNAX = dnaX+alphabetSpec DNAI = dnaI+alphabetSpec Protein = protein+alphabetSpec ProteinX = proteinX+alphabetSpec ProteinS = proteinS+alphabetSpec ProteinI = proteinI++isWith :: (AlphabetSpec -> S.Set Character) -> Alphabet -> Character -> Bool+isWith set alph char = char `S.member` set (alphabetSpec alph)++-- | Test if standard character.+isStd :: Alphabet -> Character -> Bool+isStd = isWith std++-- | Test if gap.+isGap :: Alphabet -> Character -> Bool+isGap = isWith gap++-- | Test if unknown.+isUnknown :: Alphabet -> Character -> Bool+isUnknown = isWith unknown++-- | Test if extended IUPAC character (excluding gaps and unknowns).+isIUPAC :: Alphabet -> Character -> Bool+isIUPAC = isWith iupac++-- | Test if member of alphabet.+isMember :: Alphabet -> Character -> Bool+isMember = isWith all++dna :: AlphabetSpec+dna = fromChars "ACGT" [] [] [] toStdDNA++toStdDNA :: Char -> String+toStdDNA 'A' = "A"+toStdDNA 'C' = "C"+toStdDNA 'G' = "G"+toStdDNA 'T' = "T"+toStdDNA _ = error "tostdDNA: Cannot convert to standard nucleotide."++dnaX :: AlphabetSpec+dnaX = fromChars "ACGT" "-." [] [] toStdDNAX++toStdDNAX :: Char -> String+toStdDNAX 'A' = "A"+toStdDNAX 'C' = "C"+toStdDNAX 'G' = "G"+toStdDNAX 'T' = "T"+toStdDNAX '-' = []+toStdDNAX '.' = []+toStdDNAX _ = error "toStdDNAX: Cannot convert to standard nucleotide."++dnaI :: AlphabetSpec+dnaI = fromChars "ACGT" "-." "N?" "UWSMKRYBDHV" toStdDNAI++toStdDNAI :: Char -> String+toStdDNAI 'A' = "A"+toStdDNAI 'C' = "C"+toStdDNAI 'G' = "G"+toStdDNAI 'T' = "T"+toStdDNAI 'U' = "T"+toStdDNAI 'W' = "AT"+toStdDNAI 'S' = "GC"+toStdDNAI 'M' = "AC"+toStdDNAI 'K' = "GT"+toStdDNAI 'R' = "AG"+toStdDNAI 'Y' = "CT"+toStdDNAI 'B' = "CGT"+toStdDNAI 'D' = "AGT"+toStdDNAI 'H' = "ACT"+toStdDNAI 'V' = "ACG"+toStdDNAI 'N' = "ACGT"+toStdDNAI '?' = "ACGT"+toStdDNAI '-' = []+toStdDNAI '.' = []+toStdDNAI _ = error "toStdDNAI: Cannot convert to standard nucleotide."++protein :: AlphabetSpec+protein = fromChars "ACDEFGHIKLMNPQRSTVWY" [] [] [] toStdP++toStdP :: Char -> String+toStdP 'A' = "A"+toStdP 'C' = "C"+toStdP 'D' = "D"+toStdP 'E' = "E"+toStdP 'F' = "F"+toStdP 'G' = "G"+toStdP 'H' = "H"+toStdP 'I' = "I"+toStdP 'K' = "K"+toStdP 'L' = "L"+toStdP 'M' = "M"+toStdP 'N' = "N"+toStdP 'P' = "P"+toStdP 'Q' = "Q"+toStdP 'R' = "R"+toStdP 'S' = "S"+toStdP 'T' = "T"+toStdP 'V' = "V"+toStdP 'W' = "W"+toStdP 'Y' = "Y"+toStdP _ = error "toStdP: Cannot convert to standard amino acid."++proteinX :: AlphabetSpec+proteinX = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." [] [] toStdPX++toStdPX :: Char -> String+toStdPX 'A' = "A"+toStdPX 'C' = "C"+toStdPX 'D' = "D"+toStdPX 'E' = "E"+toStdPX 'F' = "F"+toStdPX 'G' = "G"+toStdPX 'H' = "H"+toStdPX 'I' = "I"+toStdPX 'K' = "K"+toStdPX 'L' = "L"+toStdPX 'M' = "M"+toStdPX 'N' = "N"+toStdPX 'P' = "P"+toStdPX 'Q' = "Q"+toStdPX 'R' = "R"+toStdPX 'S' = "S"+toStdPX 'T' = "T"+toStdPX 'V' = "V"+toStdPX 'W' = "W"+toStdPX 'Y' = "Y"+toStdPX '-' = ""+toStdPX '.' = ""+toStdPX _ = error "toStdPX: Cannot convert to standard amino acid."++proteinS :: AlphabetSpec+proteinS = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." [] "*" toStdPS++toStdPS :: Char -> String+toStdPS 'A' = "A"+toStdPS 'C' = "C"+toStdPS 'D' = "D"+toStdPS 'E' = "E"+toStdPS 'F' = "F"+toStdPS 'G' = "G"+toStdPS 'H' = "H"+toStdPS 'I' = "I"+toStdPS 'K' = "K"+toStdPS 'L' = "L"+toStdPS 'M' = "M"+toStdPS 'N' = "N"+toStdPS 'P' = "P"+toStdPS 'Q' = "Q"+toStdPS 'R' = "R"+toStdPS 'S' = "S"+toStdPS 'T' = "T"+toStdPS 'V' = "V"+toStdPS 'W' = "W"+toStdPS 'Y' = "Y"+toStdPS '-' = ""+toStdPS '.' = ""+toStdPS '*' = ""+toStdPS _ = error "toStdPS: Cannot convert to standard amino acid."++proteinI :: AlphabetSpec+proteinI = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." "X?" "*JBZ" toStdPI++toStdPI :: Char -> String+toStdPI 'A' = "A"+toStdPI 'C' = "C"+toStdPI 'D' = "D"+toStdPI 'E' = "E"+toStdPI 'F' = "F"+toStdPI 'G' = "G"+toStdPI 'H' = "H"+toStdPI 'I' = "I"+toStdPI 'K' = "K"+toStdPI 'L' = "L"+toStdPI 'M' = "M"+toStdPI 'N' = "N"+toStdPI 'P' = "P"+toStdPI 'Q' = "Q"+toStdPI 'R' = "R"+toStdPI 'S' = "S"+toStdPI 'T' = "T"+toStdPI 'V' = "V"+toStdPI 'W' = "W"+toStdPI 'Y' = "Y"+toStdPI '-' = ""+toStdPI '.' = ""+toStdPI '*' = ""+toStdPI 'J' = "LI"+toStdPI 'B' = "DN"+toStdPI 'Z' = "EQ"+toStdPI 'X' = "ACDEFGHIKLMNPQRSTVWY"+toStdPI '?' = "ACDEFGHIKLMNPQRSTVWY"+toStdPI _ = error "toStdPI: Cannot convert to standard amino acid."
+ src/ELynx/Alphabet/Character.hs view
@@ -0,0 +1,76 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.Alphabet.Character+-- Description :  Alphabet characters+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Sun May 19 21:06:38 2019.+module ELynx.Alphabet.Character+  ( Character,+    toWord,+    fromWord,+    toChar,+    fromChar,+    toString,+    fromString,+    toCVec,+    fromCVec,+  )+where++import Data.ByteString.Internal (c2w, w2c)+import qualified Data.Vector.Unboxed as V+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Alphabet characters; abstracted so that representation can be changed at+-- some point.+newtype Character = Character Word8+  deriving (Read, Show, Eq, Ord, Bounded)++derivingUnbox+  "Character"+  [t|Character -> Word8|]+  [|\(Character w) -> w|]+  [|Character|]++-- | Conversion of 'Character's.+toWord :: Character -> Word8+toWord (Character w) = w++-- | Conversion of 'Character's.+fromWord :: Word8 -> Character+fromWord = Character++-- | Conversion of 'Character's.+toChar :: Character -> Char+toChar (Character w) = w2c w++-- | Conversion of 'Character's.+fromChar :: Char -> Character+fromChar = Character . c2w++-- | Conversion of 'Character's.+toString :: [Character] -> String+toString = map toChar++-- | Conversion of 'Character's.+fromString :: String -> [Character]+fromString = map fromChar++-- | Conversion of 'Character's.+toCVec :: C.Character a => V.Vector Character -> V.Vector a+toCVec = V.map (C.fromWord . toWord)++-- | Conversion of 'Character's.+fromCVec :: C.Character a => V.Vector a -> V.Vector Character+fromCVec = V.map (fromWord . C.toWord)
+ src/ELynx/Alphabet/DistributionDiversity.hs view
@@ -0,0 +1,110 @@+{-# LANGUAGE FlexibleContexts #-}++-- |+-- Module      :  ELynx.Alphabet.DistributionDiversity+-- Description :  Summarize statistics for alphabets+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Mon Feb 25 13:32:56 2019.+module ELynx.Alphabet.DistributionDiversity+  ( -- * Entropy+    entropy,+    kEffEntropy,++    -- * Homoplasy+    homoplasy,+    kEffHomoplasy,++    -- * Count characters+    frequencyCharacters,+  )+where++import qualified Data.Set as S+import Data.Vector.Generic+  ( Vector,+    toList,+  )+import qualified Data.Vector.Generic as V+import ELynx.Alphabet.Alphabet+import ELynx.Alphabet.Character++eps :: Double+eps = 1e-12++-- Calculate x*log(x) but set to 0.0 when x is smaller than 'eps'.+xLogX :: Double -> Double+xLogX x+  | x < 0.0 = error "Argument lower than zero."+  | eps > x = 0.0+  | otherwise = x * log x++-- | Entropy of vector.+entropy :: (Vector v Double) => v Double -> Double+entropy v =+  if isNaN res+    then+      error+        ("entropy: Sesult of following vector is NaN: " ++ show (toList v) ++ ".")+    else res+  where+    res = negate $ V.sum $ V.map xLogX v++-- | Effective number of used characters measured using 'entropy'. The result+-- only makes sense when the sum of the array is 1.0.+kEffEntropy :: Vector v Double => v Double -> Double+kEffEntropy v = if e < eps then 1.0 else exp e where e = entropy v++-- | Probability of homoplasy of vector. The result is the probability of+-- binomially sampling the same character twice and only makes sense when the+-- sum of the array is 1.0.+homoplasy :: Vector v Double => v Double -> Double+homoplasy v = V.sum $ V.map (\x -> x * x) v++-- | Effective number of used characters measured using 'homoplasy'. The result+-- only makes sense when the sum of the array is 1.0.+kEffHomoplasy :: Vector v Double => v Double -> Double+kEffHomoplasy v = 1.0 / homoplasy v++-- XXX: Use mutable vector; then V.// is much faster.+-- Increment element at index in vector by one.+incrementElemIndexByOne :: Vector v Int => [Int] -> v Int -> v Int+incrementElemIndexByOne is v = v V.// zip is es'+  where+    es' = [v V.! i + 1 | i <- is]++-- For a given code and counts vector, increment the count of the given character.+acc :: Vector v Int => AlphabetSpec -> v Int -> Character -> v Int+acc alph vec char = incrementElemIndexByOne is vec+  where+    is = [S.findIndex c (std alph) | c <- toStd alph char]++countCharacters ::+  (Vector v Character, Vector v Int) => AlphabetSpec -> v Character -> v Int+countCharacters alph = V.foldl' (acc alph) zeroCounts+  where+    nChars = length (std alph)+    zeroCounts = V.replicate nChars (0 :: Int)++saveDivision :: Int -> Int -> Double+saveDivision value divisor =+  if divisor == 0 then 0.0 else fromIntegral value / fromIntegral divisor++-- | For a given code vector of characters, calculate frequency of characters.+-- The input vector has arbitrary length (most often the number of sequences in+-- an alignment), the length of the output vector is the number of characters in+-- the alphabet.+frequencyCharacters ::+  (Vector v Character, Vector v Int, Vector v Double) =>+  AlphabetSpec ->+  v Character ->+  v Double+frequencyCharacters alph d = V.map (`saveDivision` s) counts+  where+    counts = countCharacters alph d+    s = V.sum counts
+ src/ELynx/Character/AminoAcid.hs view
@@ -0,0 +1,113 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.AminoAcid+-- Description :  Amino acid related types and functions+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- Amino acids in alphabetical order.+--+-- @+-- Amino Acid Code:  Three letter Code:  Amino Acid:+-- ----------------  ------------------  -----------+-- A                 Ala                 Alanine+-- C                 Cys                 Cysteine+-- D                 Asp                 Aspartic Acid+-- E                 Glu                 Glutamic Acid+-- F                 Phe                 Phenylalanine+-- G                 Gly                 Glycine+-- H                 His                 Histidine+-- I                 Ile                 Isoleucine+-- K                 Lys                 Lysine+-- L                 Leu                 Leucine+-- M                 Met                 Methionine+-- N                 Asn                 Asparagine+-- P                 Pro                 Proline+-- Q                 Gln                 Glutamine+-- R                 Arg                 Arginine+-- S                 Ser                 Serine+-- T                 Thr                 Threonine+-- V                 Val                 Valine+-- W                 Trp                 Tryptophan+-- Y                 Tyr                 Tyrosine+-- @+module ELynx.Character.AminoAcid+  ( AminoAcid (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Amino acids.+data AminoAcid = A | C | D | E | F | G | H | I | K | L | M | N | P | Q | R | S | T | V | W | Y+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++toWord :: AminoAcid -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord D = c2w 'D'+toWord E = c2w 'E'+toWord F = c2w 'F'+toWord G = c2w 'G'+toWord H = c2w 'H'+toWord I = c2w 'I'+toWord K = c2w 'K'+toWord L = c2w 'L'+toWord M = c2w 'M'+toWord N = c2w 'N'+toWord P = c2w 'P'+toWord Q = c2w 'Q'+toWord R = c2w 'R'+toWord S = c2w 'S'+toWord T = c2w 'T'+toWord V = c2w 'V'+toWord W = c2w 'W'+toWord Y = c2w 'Y'++fromWord :: Word8 -> AminoAcid+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'D' -> D+  'E' -> E+  'F' -> F+  'G' -> G+  'H' -> H+  'I' -> I+  'K' -> K+  'L' -> L+  'M' -> M+  'N' -> N+  'P' -> P+  'Q' -> Q+  'R' -> R+  'S' -> S+  'T' -> T+  'V' -> V+  'W' -> W+  'Y' -> Y+  _ -> error "fromWord: Cannot convert to AminoAcid."++derivingUnbox+  "AminoAcid"+  [t|AminoAcid -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character AminoAcid where+  toWord = toWord+  fromWord = fromWord
+ src/ELynx/Character/AminoAcidI.hs view
@@ -0,0 +1,212 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.AminoAcid+-- Description :  Amino acid related types and functions+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- Amino acid IUPAC code. See also https://www.bioinformatics.org/sms/iupac.html or+-- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.+--+-- Remarks:+--+-- - Question marks (@?@) are interpreted as unknowns (same as @X@). However, when+--   a sequence is printed/exported, @X@s will be used.+--+-- - Full stops (@.@) are interpreted as gaps (same as @-@). However, when a+--   sequence is printed/exported, @-@s will be used+--+-- @+-- Amino Acid Code:  Three letter Code:  Amino Acid:+-- ----------------  ------------------  -----------+-- A                 Ala                 Alanine+-- C                 Cys                 Cysteine+-- D                 Asp                 Aspartic Acid+-- E                 Glu                 Glutamic Acid+-- F                 Phe                 Phenylalanine+-- G                 Gly                 Glycine+-- H                 His                 Histidine+-- I                 Ile                 Isoleucine+-- K                 Lys                 Lysine+-- L                 Leu                 Leucine+-- M                 Met                 Methionine+-- N                 Asn                 Asparagine+-- P                 Pro                 Proline+-- Q                 Gln                 Glutamine+-- R                 Arg                 Arginine+-- S                 Ser                 Serine+-- T                 Thr                 Threonine+-- V                 Val                 Valine+-- W                 Trp                 Tryptophan+-- Y                 Tyr                 Tyrosine+-- ----------------  ------------------  -----------+-- J                                     Leucine or Isoleucine+-- B                 Asx                 Aspartic acid or Asparagine+-- Z                 Glx                 Glutamine or Glutamic acid+-- ----------------  ------------------  -----------+-- X                 Xaa                 Any amino acid (preferred; used for printing)+-- ?                 Xaa                 Any amino acid+-- ----------------  ------------------  -----------+-- *                 Stp                 No amino acid+-- ----------------  ------------------  -----------+-- -                 Gap                 No amino acid (preferred; used for printing)+-- .                 Gap                 No amino acid+-- @+module ELynx.Character.AminoAcidI+  ( AminoAcidI (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Amino acids.+data AminoAcidI+  = A+  | C+  | D+  | E+  | F+  | G+  | H+  | I+  | K+  | L+  | M+  | N+  | P+  | Q+  | R+  | S+  | T+  | V+  | W+  | Y+  | J+  | B+  | Z+  | X+  | Stop+  | Gap+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++toWord :: AminoAcidI -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord D = c2w 'D'+toWord E = c2w 'E'+toWord F = c2w 'F'+toWord G = c2w 'G'+toWord H = c2w 'H'+toWord I = c2w 'I'+toWord K = c2w 'K'+toWord L = c2w 'L'+toWord M = c2w 'M'+toWord N = c2w 'N'+toWord P = c2w 'P'+toWord Q = c2w 'Q'+toWord R = c2w 'R'+toWord S = c2w 'S'+toWord T = c2w 'T'+toWord V = c2w 'V'+toWord W = c2w 'W'+toWord Y = c2w 'Y'+toWord J = c2w 'J'+toWord B = c2w 'B'+toWord Z = c2w 'Z'+toWord X = c2w 'X'+toWord Stop = c2w '*'+toWord Gap = c2w '-'++fromWord :: Word8 -> AminoAcidI+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'D' -> D+  'E' -> E+  'F' -> F+  'G' -> G+  'H' -> H+  'I' -> I+  'K' -> K+  'L' -> L+  'M' -> M+  'N' -> N+  'P' -> P+  'Q' -> Q+  'R' -> R+  'S' -> S+  'T' -> T+  'V' -> V+  'W' -> W+  'Y' -> Y+  'J' -> J+  'B' -> B+  'Z' -> Z+  'X' -> X+  -- Question marks code for @X@s.+  '?' -> X+  '*' -> Stop+  '-' -> Gap+  -- Full stops code for gaps (@-@s).+  '.' -> Gap+  _ -> error "fromWord: Cannot convert Word8 to AminoAcidI"++derivingUnbox+  "AminoAcidI"+  [t|AminoAcidI -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character AminoAcidI where+  toWord = toWord+  fromWord = fromWord++instance C.CharacterX AminoAcidI where+  gap = Gap++toStandard :: AminoAcidI -> [AminoAcidI]+toStandard A = [A]+toStandard C = [C]+toStandard D = [D]+toStandard E = [E]+toStandard F = [F]+toStandard G = [G]+toStandard H = [H]+toStandard I = [I]+toStandard K = [K]+toStandard L = [L]+toStandard M = [M]+toStandard N = [N]+toStandard P = [P]+toStandard Q = [Q]+toStandard R = [R]+toStandard S = [S]+toStandard T = [T]+toStandard V = [V]+toStandard W = [W]+toStandard Y = [Y]+toStandard J = [L, I]+toStandard B = [D, N]+toStandard Z = [E, Q]+toStandard X = [A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y]+toStandard Stop = []+toStandard Gap = []++instance C.CharacterI AminoAcidI where+  unknown = X+  iupac = [J, B, Z, X]+  toStandard = toStandard
+ src/ELynx/Character/AminoAcidS.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.AminoAcid+-- Description :  Amino acid related types and functions+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- Amino acids with gaps and translation stops.+--+-- @+-- Amino Acid Code:  Three letter Code:  Amino Acid:+-- ----------------  ------------------  -----------+-- A                 Ala                 Alanine+-- C                 Cys                 Cysteine+-- D                 Asp                 Aspartic Acid+-- E                 Glu                 Glutamic Acid+-- F                 Phe                 Phenylalanine+-- G                 Gly                 Glycine+-- H                 His                 Histidine+-- I                 Ile                 Isoleucine+-- K                 Lys                 Lysine+-- L                 Leu                 Leucine+-- M                 Met                 Methionine+-- N                 Asn                 Asparagine+-- P                 Pro                 Proline+-- Q                 Gln                 Glutamine+-- R                 Arg                 Arginine+-- S                 Ser                 Serine+-- T                 Thr                 Threonine+-- V                 Val                 Valine+-- W                 Trp                 Tryptophan+-- Y                 Tyr                 Tyrosine+-- ----------------  ------------------  -----------+-- *                 Stp                 No amino acid+-- ----------------  ------------------  -----------+-- -                 Gap                 No amino acid (preferred)+-- .                 Gap                 No amino acid+-- @+module ELynx.Character.AminoAcidS+  ( AminoAcidS (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Amino acids.+data AminoAcidS+  = A+  | C+  | D+  | E+  | F+  | G+  | H+  | I+  | K+  | L+  | M+  | N+  | P+  | Q+  | R+  | S+  | T+  | V+  | W+  | Y+  | Stop+  | Gap+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++toWord :: AminoAcidS -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord D = c2w 'D'+toWord E = c2w 'E'+toWord F = c2w 'F'+toWord G = c2w 'G'+toWord H = c2w 'H'+toWord I = c2w 'I'+toWord K = c2w 'K'+toWord L = c2w 'L'+toWord M = c2w 'M'+toWord N = c2w 'N'+toWord P = c2w 'P'+toWord Q = c2w 'Q'+toWord R = c2w 'R'+toWord S = c2w 'S'+toWord T = c2w 'T'+toWord V = c2w 'V'+toWord W = c2w 'W'+toWord Y = c2w 'Y'+toWord Stop = c2w '*'+toWord Gap = c2w '-'++fromWord :: Word8 -> AminoAcidS+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'D' -> D+  'E' -> E+  'F' -> F+  'G' -> G+  'H' -> H+  'I' -> I+  'K' -> K+  'L' -> L+  'M' -> M+  'N' -> N+  'P' -> P+  'Q' -> Q+  'R' -> R+  'S' -> S+  'T' -> T+  'V' -> V+  'W' -> W+  'Y' -> Y+  '*' -> Stop+  '-' -> Gap+  '.' -> Gap+  _ -> error "fromWord: Cannot convert to AminoAcidS."++derivingUnbox+  "AminoAcidS"+  [t|AminoAcidS -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character AminoAcidS where+  toWord = toWord+  fromWord = fromWord++instance C.CharacterX AminoAcidS where+  gap = Gap
+ src/ELynx/Character/AminoAcidX.hs view
@@ -0,0 +1,145 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.AminoAcid+-- Description :  Amino acid related types and functions+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- Extended amino acid with gaps. See also+-- https://www.bioinformatics.org/sms/iupac.html or+-- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.+--+-- @+-- Amino Acid Code:  Three letter Code:  Amino Acid:+-- ----------------  ------------------  -----------+-- A                 Ala                 Alanine+-- C                 Cys                 Cysteine+-- D                 Asp                 Aspartic Acid+-- E                 Glu                 Glutamic Acid+-- F                 Phe                 Phenylalanine+-- G                 Gly                 Glycine+-- H                 His                 Histidine+-- I                 Ile                 Isoleucine+-- K                 Lys                 Lysine+-- L                 Leu                 Leucine+-- M                 Met                 Methionine+-- N                 Asn                 Asparagine+-- P                 Pro                 Proline+-- Q                 Gln                 Glutamine+-- R                 Arg                 Arginine+-- S                 Ser                 Serine+-- T                 Thr                 Threonine+-- V                 Val                 Valine+-- W                 Trp                 Tryptophan+-- Y                 Tyr                 Tyrosine+-- ----------------  ------------------  -----------+-- -                 Gap                 No amino acid+-- .                 Gap                 No amino acid+-- @+module ELynx.Character.AminoAcidX+  ( AminoAcidX (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Amino acids.+data AminoAcidX+  = A+  | C+  | D+  | E+  | F+  | G+  | H+  | I+  | K+  | L+  | M+  | N+  | P+  | Q+  | R+  | S+  | T+  | V+  | W+  | Y+  | Gap+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++toWord :: AminoAcidX -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord D = c2w 'D'+toWord E = c2w 'E'+toWord F = c2w 'F'+toWord G = c2w 'G'+toWord H = c2w 'H'+toWord I = c2w 'I'+toWord K = c2w 'K'+toWord L = c2w 'L'+toWord M = c2w 'M'+toWord N = c2w 'N'+toWord P = c2w 'P'+toWord Q = c2w 'Q'+toWord R = c2w 'R'+toWord S = c2w 'S'+toWord T = c2w 'T'+toWord V = c2w 'V'+toWord W = c2w 'W'+toWord Y = c2w 'Y'+toWord Gap = c2w '-'++fromWord :: Word8 -> AminoAcidX+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'D' -> D+  'E' -> E+  'F' -> F+  'G' -> G+  'H' -> H+  'I' -> I+  'K' -> K+  'L' -> L+  'M' -> M+  'N' -> N+  'P' -> P+  'Q' -> Q+  'R' -> R+  'S' -> S+  'T' -> T+  'V' -> V+  'W' -> W+  'Y' -> Y+  '-' -> Gap+  '.' -> Gap+  _ -> error "fromWord: Cannot convert to AminoAcidX."++derivingUnbox+  "AminoAcidX"+  [t|AminoAcidX -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character AminoAcidX where+  toWord = toWord+  fromWord = fromWord++instance C.CharacterX AminoAcidX where+  gap = Gap
+ src/ELynx/Character/Character.hs view
@@ -0,0 +1,94 @@+-- |+-- Module      :  Character+-- Description :  Character interface+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Oct 12 16:24:02 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+module ELynx.Character.Character+  ( Character (..),+    fromChar,+    toChar,+    fromString,+    toString,+    CharacterX (..),+    isGap,+    CharacterI (..),+    isUnknown,+    isIUPAC,+    isStandard,+    convert,+  )+where++import Data.ByteString.Internal (c2w, w2c)+import qualified Data.Set as S+import Data.Vector.Unboxed.Base (Unbox)+import Data.Word8 (Word8)++-- XXX: Remove name clash with ELynx.Alphabet.Alphabet.Character?++-- | A set of characters forms an 'ELynx.Alphabet.Alphabet'. At the+-- moment, 'Word8' is used, since none of the alphabets has more than 255+-- characters.+class (Show a, Read a, Eq a, Ord a, Enum a, Bounded a, Unbox a) => Character a where+  -- | Write characters.+  toWord :: a -> Word8++  -- | Read characters.+  fromWord :: Word8 -> a++-- | Conversion to 'Char'.+toChar :: Character a => a -> Char+toChar = w2c . toWord++-- | Conversion from 'Char'.+fromChar :: Character a => Char -> a+fromChar = fromWord . c2w++-- | Conversion to 'String'.+toString :: Character a => [a] -> String+toString = map toChar++-- | Conversion from 'String'.+fromString :: Character a => String -> [a]+fromString = map fromChar++-- | An extended character type with gaps and unknowns.+class Character a => CharacterX a where+  gap :: a++-- | Is the character a gap or unknown?+isGap :: CharacterX a => a -> Bool+isGap c = c == gap++-- | IUPAC characters with a mapping to extended characters.+class CharacterX a => CharacterI a where+  unknown :: a+  iupac :: [a]+  toStandard :: a -> [a]++-- | Check if a IUPAC 'CharacterI' is unknown (e.g., N for nucleotides).+isUnknown :: CharacterI a => a -> Bool+isUnknown c = c == unknown++iupacLookup :: CharacterI a => S.Set a+iupacLookup = S.fromList iupac++-- | Is the given character a IUPAC character?+isIUPAC :: CharacterI a => a -> Bool+isIUPAC c = c `S.member` iupacLookup++-- | Is the given character a standard character?+isStandard :: CharacterI a => a -> Bool+isStandard c = not $ isIUPAC c++-- | Convert between character classes. May throw error.+convert :: (Character a, Character b) => a -> b+convert = fromWord . toWord
+ src/ELynx/Character/Codon.hs view
@@ -0,0 +1,258 @@+{-# LANGUAGE DeriveGeneric #-}++-- |+-- Module      :  ELynx.Character.Codon+-- Description :  Codons are triplets of nucleotides+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu May 16 07:58:50 2019.+--+-- The different universal codes.+-- - https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=c+-- - http://www.bioinformatics.org/sms2/genetic_code.html+-- - https://en.wikipedia.org/wiki/Genetic_code+module ELynx.Character.Codon+  ( Codon (Codon),+    fromVecUnsafe,+    UniversalCode (..),+    translate,+    translateX,+    translateI,+  )+where++import Data.Aeson+  ( FromJSON,+    ToJSON,+  )+import Data.List+import qualified Data.Map as M+import qualified Data.Vector.Generic as V+import qualified ELynx.Character.AminoAcidI as AI+import ELynx.Character.AminoAcidS+import qualified ELynx.Character.Character as C+import qualified ELynx.Character.Nucleotide as N+import qualified ELynx.Character.NucleotideI as NI+import qualified ELynx.Character.NucleotideX as NX+import GHC.Generics (Generic)++-- | Codons are triplets of characters.+newtype Codon a = Codon (a, a, a)+  deriving (Show, Read, Eq, Ord)++convert :: (C.Character a, C.Character b) => Codon a -> Codon b+convert (Codon (x, y, z)) = Codon (C.convert x, C.convert y, C.convert z)++-- | Unsafe conversion from vector with at least three elements; only the first+-- three elements are used, the rest is discarded.+fromVecUnsafe :: V.Vector v a => v a -> Codon a+fromVecUnsafe xs =+  Codon (V.head xs, V.head . V.tail $ xs, V.head . V.tail . V.tail $ xs)++-- | Universal codes.+data UniversalCode = Standard | VertebrateMitochondrial+  deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic)++instance FromJSON UniversalCode++instance ToJSON UniversalCode++-- It is important that the map is lazy, because some keys have errors as values.+mapFromLists :: Ord a => [a] -> [a] -> [a] -> [b] -> M.Map (Codon a) b+mapFromLists xs ys zs as =+  M.fromList $ zipWith4 (\f s t a -> (Codon (f, s, t), a)) xs ys zs as++nucs :: Enum a => [a]+nucs = map toEnum [3, 1, 0, 2] -- Order T, C, A , G.++-- Permutation of the triplets PLUS GAPS! I avoid 'Z' because I do not want to+-- translate DNAI.+base1, base2, base3 :: Enum a => [a]+base1 = [n | n <- nucs, _ <- [0 .. 3 :: Int], _ <- [0 .. 3 :: Int]]+-- base1 = "TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG" ++ "-."+base2 = [n | _ <- [0 .. 3 :: Int], n <- nucs, _ <- [0 .. 3 :: Int]]+-- base2 = "TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG" ++ "-."+base3 = [n | _ <- [0 .. 3 :: Int], _ <- [0 .. 3 :: Int], n <- nucs]++-- base3 = "TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG" ++ "-."++-- The actual codes.+standard :: [AminoAcidS]+standard =+  [ F,+    F,+    L,+    L,+    S,+    S,+    S,+    S,+    Y,+    Y,+    Stop,+    Stop,+    C,+    C,+    Stop,+    W,+    L,+    L,+    L,+    L,+    P,+    P,+    P,+    P,+    H,+    H,+    Q,+    Q,+    R,+    R,+    R,+    R,+    I,+    I,+    I,+    M,+    T,+    T,+    T,+    T,+    N,+    N,+    K,+    K,+    S,+    S,+    R,+    R,+    V,+    V,+    V,+    V,+    A,+    A,+    A,+    A,+    D,+    D,+    E,+    E,+    G,+    G,+    G,+    G+  ]++-- "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG" ++ "--"++vertebrateMitochondrial :: [AminoAcidS]+vertebrateMitochondrial =+  [ F,+    F,+    L,+    L,+    S,+    S,+    S,+    S,+    Y,+    Y,+    Stop,+    Stop,+    C,+    C,+    W,+    W,+    L,+    L,+    L,+    L,+    P,+    P,+    P,+    P,+    H,+    H,+    Q,+    Q,+    R,+    R,+    R,+    R,+    I,+    I,+    M,+    M,+    T,+    T,+    T,+    T,+    N,+    N,+    K,+    K,+    S,+    S,+    Stop,+    Stop,+    V,+    V,+    V,+    V,+    A,+    A,+    A,+    A,+    D,+    D,+    E,+    E,+    G,+    G,+    G,+    G+  ]++-- "FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSS**VVVVAAAADDEEGGGG" ++ "--"++-- | Translate a codon to amino acids including translation stops.+translate :: UniversalCode -> Codon N.Nucleotide -> AminoAcidS+translate code = (M.!) (universalCode code)++-- | Translate a codon to amino acids including translation stops. Translate+-- codons including gaps to amino acid gaps. Be careful, single or two character+-- gaps can lead to a reading frame shift and hence, the translated sequence may+-- be bogus.+translateX :: UniversalCode -> Codon NX.NucleotideX -> AminoAcidS+-- translateX _ (Codon (NX.Gap, NX.Gap, NX.Gap)) = Gap+-- translateX code codon                         = C.convert . translate code . convert $ codon+translateX code codon@(Codon (x, y, z))+  | C.isGap x || C.isGap y || C.isGap z = Gap+  | otherwise = C.convert . translate code . convert $ codon++-- | Translate a codon to amino acids including translation stops. Translate gap+-- triplets to amino acid gaps, and triplets including unknowns to amino acid+-- unknowns. Be careful, also translates other IUPAC characters to amino acid Xs!+translateI :: UniversalCode -> Codon NI.NucleotideI -> AI.AminoAcidI+translateI code codon@(Codon (x, y, z))+  | C.isIUPAC x || C.isIUPAC y || C.isIUPAC z = AI.X+  | otherwise = C.convert . translateX code . convert $ codon++-- translateI :: UniversalCode -> Codon NI.NucleotideI -> AI.AminoAcidI+-- translateI _ (Codon (NI.N, _,    _   )) = AI.X+-- translateI _ (Codon (_   , NI.N, _   )) = AI.X+-- translateI _ (Codon (_,    _,    NI.N)) = AI.X+-- translateI code codon                   = C.convert . translateX code . convert $ codon++-- Map from 'Codon' to amino acid character.+universalCode :: UniversalCode -> M.Map (Codon N.Nucleotide) AminoAcidS+universalCode Standard = mapFromLists base1 base2 base3 standard+universalCode VertebrateMitochondrial =+  mapFromLists base1 base2 base3 vertebrateMitochondrial
+ src/ELynx/Character/Nucleotide.hs view
@@ -0,0 +1,67 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.Nucleotide+-- Description :  Nucleotides+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- @+-- Symbol  Description  Bases represented  Complement+-- ------  -----------  -----------------  ----------+-- A       Adenine      A                  T+-- C       Cytosine        C               G+-- G       Guanine            G            C+-- T       Thymine               T         A+-- @+module ELynx.Character.Nucleotide+  ( Nucleotide (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Nucleotides.+data Nucleotide = A | C | G | T+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++-- See https://stackoverflow.com/a/31527024; apparently, pattern matching (and+-- case statements) are fast because they are compiled to lookup tables. Hence,+-- they are faster than guards (because equality has to be checked), and faster+-- than lookups with sets.+toWord :: Nucleotide -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord G = c2w 'G'+toWord T = c2w 'T'++fromWord :: Word8 -> Nucleotide+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'G' -> G+  'T' -> T+  c -> error $ "fromWord: Cannot convert " ++ show c ++ " to Nucleotide."++derivingUnbox+  "Nucleotide"+  [t|Nucleotide -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character Nucleotide where+  toWord = toWord+  fromWord = fromWord
+ src/ELynx/Character/NucleotideI.hs view
@@ -0,0 +1,168 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.NucleotideI+-- Description :  Nucleotides with IUPAC characters+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:26:35 2018.+--+-- See header of 'ELynx.Alphabet.Alphabet'.+--+-- Nucleotide IUPAC code. See also https://www.bioinformatics.org/sms/iupac.html or+-- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.+--+-- Remarks:+--+-- - Question marks (@?@) are interpreted as unknowns (same as @N@). However, when+--   a sequence is printed/exported, @N@s will be used.+--+-- - Full stops (@.@) are interpreted as gaps (same as @-@). However, when a+--   sequence is printed/exported, @-@s will be used+--+-- @+-- Symbol  Description  Bases represented  Complement+-- ------  -----------  -----------------  ----------+-- A       Adenine      A                  T+-- C       Cytosine        C               G+-- G       Guanine            G            C+-- T       Thymine               T         A+-- ------  -----------  -----------------  ----------+-- U       Uracil                U         A+-- W       Weak         A        T         W+-- S       Strong          C  G            S+-- M       aMino        A  C               K+-- K       Keto               G  T         M+-- R       puRine       A     G            Y+-- Y       pYrimidine      C     T         R+-- B       not A           C  G  T         V+-- D       not C        A     G  T         H+-- H       not G        A  C     T         D+-- V       not T        A  C  G            B+-- ------  -----------  -----------------  ----------+-- N       any          A  C  G  T         N           (preferred)+-- ?       any          A  C  G  T         N+-- ------  -----------  -----------------  ----------+-- -       Gap (Zero)                      -           (preferred)+-- .       Gap (Zero)                      -+-- @+module ELynx.Character.NucleotideI+  ( NucleotideI (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | NucleotideIs.+data NucleotideI+  = A+  | C+  | G+  | T+  | U+  | W+  | S+  | M+  | K+  | R+  | Y+  | B+  | D+  | H+  | V+  | N+  | Gap+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++-- See https://stackoverflow.com/a/31527024; apparently, pattern matching (and+-- case statements) are fast because they are compiled to lookup tables. Hence,+-- they are faster than guards (because equality has to be checked), and faster+-- than lookups with sets.+toWord :: NucleotideI -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord G = c2w 'G'+toWord T = c2w 'T'+toWord U = c2w 'U'+toWord W = c2w 'W'+toWord S = c2w 'S'+toWord M = c2w 'M'+toWord K = c2w 'K'+toWord R = c2w 'R'+toWord Y = c2w 'Y'+toWord B = c2w 'B'+toWord D = c2w 'D'+toWord H = c2w 'H'+toWord V = c2w 'V'+toWord N = c2w 'N'+toWord Gap = c2w '-'++fromWord :: Word8 -> NucleotideI+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'G' -> G+  'T' -> T+  'U' -> U+  'W' -> W+  'S' -> S+  'M' -> M+  'K' -> K+  'R' -> R+  'Y' -> Y+  'B' -> B+  'D' -> D+  'H' -> H+  'V' -> V+  'N' -> N+  '?' -> N+  '-' -> Gap+  '.' -> Gap+  _ -> error "fromWord: Cannot convert to NucleotideI."++derivingUnbox+  "NucleotideI"+  [t|NucleotideI -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character NucleotideI where+  toWord = toWord+  fromWord = fromWord++toStandard :: NucleotideI -> [NucleotideI]+toStandard A = [A]+toStandard C = [C]+toStandard G = [G]+toStandard T = [T]+toStandard U = [T]+toStandard W = [A, T]+toStandard S = [G, C]+toStandard M = [A, C]+toStandard K = [G, T]+toStandard R = [A, G]+toStandard Y = [C, T]+toStandard B = [C, G, T]+toStandard D = [A, G, T]+toStandard H = [A, C, T]+toStandard V = [A, C, G]+toStandard N = [A, C, G, T]+toStandard Gap = []++instance C.CharacterX NucleotideI where+  gap = Gap++instance C.CharacterI NucleotideI where+  unknown = N+  iupac = [U, W, S, M, K, R, Y, B, D, H, V, N]+  toStandard = toStandard
+ src/ELynx/Character/NucleotideX.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}++-- |+-- Module      :  ELynx.NucleotideX+-- Description :  Extended nucleotides including gaps and unknowns+-- Copyright   :  (c) Dominik Schrempf 2021+--+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- See header of 'ELynx.Alphabet'.+--+-- Extended nucleotides with gaps. See also+-- https://www.bioinformatics.org/sms/iupac.html or+-- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.+--+-- @+-- Symbol  Description  Bases represented  Complement+-- ------  -----------  -----------------  ----------+-- A       Adenine      A                  T+-- C       Cytosine        C               G+-- G       Guanine            G            C+-- T       Thymine               T         A+-- ------  -----------  -----------------  ----------+-- - or .  Gap (Zero)                      -+-- @+module ELynx.Character.NucleotideX+  ( NucleotideX (..),+  )+where++import Data.ByteString.Internal (c2w, w2c)+import Data.Vector.Unboxed.Deriving+import Data.Word8+import qualified ELynx.Character.Character as C++-- | Extended nucleotides.+data NucleotideX+  = A+  | C+  | G+  | T+  | Gap+  deriving (Show, Read, Eq, Ord, Enum, Bounded)++toWord :: NucleotideX -> Word8+toWord A = c2w 'A'+toWord C = c2w 'C'+toWord G = c2w 'G'+toWord T = c2w 'T'+toWord Gap = c2w '-'++fromWord :: Word8 -> NucleotideX+fromWord w = case w2c w of+  'A' -> A+  'C' -> C+  'G' -> G+  'T' -> T+  '-' -> Gap+  '.' -> Gap+  c -> error $ "fromWord: Cannot convert " ++ show c ++ " to NucleotideX."++derivingUnbox+  "NucleotideX"+  [t|NucleotideX -> Word8|]+  [|toWord|]+  [|fromWord|]++instance C.Character NucleotideX where+  toWord = toWord+  fromWord = fromWord++instance C.CharacterX NucleotideX where+  gap = Gap
− src/ELynx/Data/Alphabet/Alphabet.hs
@@ -1,310 +0,0 @@-{-# LANGUAGE DeriveGeneric #-}---- |--- Module      :  ELynx.Data.Alphabet.Alphabet--- Description :  Alphabets store hereditary information--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable------ Portability :  portable------ Creation date: Fri May 10 11:10:32 2019.------ Hierarchy:------ 1. 'Character' type.------ 2. Sets of 'Character's form 'Alphabet's; each 'Alphabet' has a specification--- 'AlphabetSpec'.------ New alphabets have to be added manually to this module.------ This way of handling characters and alphabets IS NOT TYPE SAFE, but much, much--- faster. A second layer of modules such as 'ELynx.Data.Character.Nucleotide'--- depend on a 'ELynx.Data.Character.Character.Character' type class. Hence, they--- provide a type safe way of handling alphabets. Conversion is possible, for--- instance, with 'ELynx.Data.Alphabet.Character.fromCVec', and--- 'ELynx.Data.Alphabet.Character.toCVec'.-module ELynx.Data.Alphabet.Alphabet-  ( Alphabet (..),-    AlphabetSpec (..),-    alphabetSpec,-    alphabetDescription,-    isStd,-    isGap,-    isUnknown,-    isIUPAC,-    isMember,-  )-where--import Data.Aeson-  ( FromJSON,-    ToJSON,-  )-import qualified Data.Set as S-import ELynx.Data.Alphabet.Character-import GHC.Generics (Generic)-import Prelude hiding (all)---- | Available alphabets; for details see 'alphabetSpec'.-data Alphabet-  = DNA-  | DNAX-  | DNAI-  | Protein-  | ProteinX-  | ProteinS-  | ProteinI-  deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic)--instance FromJSON Alphabet--instance ToJSON Alphabet---- | Verbose alphabet name.-alphabetDescription :: Alphabet -> String-alphabetDescription DNA = "DNA (nucleotides)"-alphabetDescription DNAX = "DNAX (nucleotides; including gaps)"-alphabetDescription DNAI =-  "DNAI (nucleotides; including gaps, and IUPAC codes)"-alphabetDescription Protein = "Protein (amino acids)"-alphabetDescription ProteinX = "ProteinX (amino acids; including gaps)"-alphabetDescription ProteinS =-  "ProteinS (amino acids; including gaps, and translation stops)"-alphabetDescription ProteinI =-  "ProteinI (amino acids; including gaps, translation stops, and IUPAC codes)"---- | Alphabet specification. 'S.Set' is used because it provides fast lookups.-data AlphabetSpec = AlphabetSpec-  { -- | Standard characters.-    std :: !(S.Set Character),-    -- | Gap characters.-    gap :: !(S.Set Character),-    -- | Unknown characters.-    unknown :: !(S.Set Character),-    -- | Other IUPAC codes.-    iupac :: !(S.Set Character),-    -- | All characters in the alphabet.-    all :: !(S.Set Character),-    -- | Convert from IUPAC to the corresponding standard characters.-    toStd :: Character -> [Character]-  }---- Create alphabet spec.-fromChars ::-  String -> String -> String -> String -> (Char -> String) -> AlphabetSpec-fromChars st ga un iu to =-  AlphabetSpec-    st'-    ga'-    un'-    iu'-    al-    (fromString . to . toChar)-  where-    st' = S.fromList $ fromString st-    ga' = S.fromList $ fromString ga-    un' = S.fromList $ fromString un-    iu' = S.fromList $ fromString iu-    al = S.unions [st', ga', un', iu']---- | Get the alphabet specification for a given alphabet.-alphabetSpec :: Alphabet -> AlphabetSpec-alphabetSpec DNA = dna-alphabetSpec DNAX = dnaX-alphabetSpec DNAI = dnaI-alphabetSpec Protein = protein-alphabetSpec ProteinX = proteinX-alphabetSpec ProteinS = proteinS-alphabetSpec ProteinI = proteinI--isWith :: (AlphabetSpec -> S.Set Character) -> Alphabet -> Character -> Bool-isWith set alph char = char `S.member` set (alphabetSpec alph)---- | Test if standard character.-isStd :: Alphabet -> Character -> Bool-isStd = isWith std---- | Test if gap.-isGap :: Alphabet -> Character -> Bool-isGap = isWith gap---- | Test if unknown.-isUnknown :: Alphabet -> Character -> Bool-isUnknown = isWith unknown---- | Test if extended IUPAC character (excluding gaps and unknowns).-isIUPAC :: Alphabet -> Character -> Bool-isIUPAC = isWith iupac---- | Test if member of alphabet.-isMember :: Alphabet -> Character -> Bool-isMember = isWith all--dna :: AlphabetSpec-dna = fromChars "ACGT" [] [] [] toStdDNA--toStdDNA :: Char -> String-toStdDNA 'A' = "A"-toStdDNA 'C' = "C"-toStdDNA 'G' = "G"-toStdDNA 'T' = "T"-toStdDNA _ = error "tostdDNA: Cannot convert to standard nucleotide."--dnaX :: AlphabetSpec-dnaX = fromChars "ACGT" "-." [] [] toStdDNAX--toStdDNAX :: Char -> String-toStdDNAX 'A' = "A"-toStdDNAX 'C' = "C"-toStdDNAX 'G' = "G"-toStdDNAX 'T' = "T"-toStdDNAX '-' = []-toStdDNAX '.' = []-toStdDNAX _ = error "toStdDNAX: Cannot convert to standard nucleotide."--dnaI :: AlphabetSpec-dnaI = fromChars "ACGT" "-." "N?" "UWSMKRYBDHV" toStdDNAI--toStdDNAI :: Char -> String-toStdDNAI 'A' = "A"-toStdDNAI 'C' = "C"-toStdDNAI 'G' = "G"-toStdDNAI 'T' = "T"-toStdDNAI 'U' = "T"-toStdDNAI 'W' = "AT"-toStdDNAI 'S' = "GC"-toStdDNAI 'M' = "AC"-toStdDNAI 'K' = "GT"-toStdDNAI 'R' = "AG"-toStdDNAI 'Y' = "CT"-toStdDNAI 'B' = "CGT"-toStdDNAI 'D' = "AGT"-toStdDNAI 'H' = "ACT"-toStdDNAI 'V' = "ACG"-toStdDNAI 'N' = "ACGT"-toStdDNAI '?' = "ACGT"-toStdDNAI '-' = []-toStdDNAI '.' = []-toStdDNAI _ = error "toStdDNAI: Cannot convert to standard nucleotide."--protein :: AlphabetSpec-protein = fromChars "ACDEFGHIKLMNPQRSTVWY" [] [] [] toStdP--toStdP :: Char -> String-toStdP 'A' = "A"-toStdP 'C' = "C"-toStdP 'D' = "D"-toStdP 'E' = "E"-toStdP 'F' = "F"-toStdP 'G' = "G"-toStdP 'H' = "H"-toStdP 'I' = "I"-toStdP 'K' = "K"-toStdP 'L' = "L"-toStdP 'M' = "M"-toStdP 'N' = "N"-toStdP 'P' = "P"-toStdP 'Q' = "Q"-toStdP 'R' = "R"-toStdP 'S' = "S"-toStdP 'T' = "T"-toStdP 'V' = "V"-toStdP 'W' = "W"-toStdP 'Y' = "Y"-toStdP _ = error "toStdP: Cannot convert to standard amino acid."--proteinX :: AlphabetSpec-proteinX = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." [] [] toStdPX--toStdPX :: Char -> String-toStdPX 'A' = "A"-toStdPX 'C' = "C"-toStdPX 'D' = "D"-toStdPX 'E' = "E"-toStdPX 'F' = "F"-toStdPX 'G' = "G"-toStdPX 'H' = "H"-toStdPX 'I' = "I"-toStdPX 'K' = "K"-toStdPX 'L' = "L"-toStdPX 'M' = "M"-toStdPX 'N' = "N"-toStdPX 'P' = "P"-toStdPX 'Q' = "Q"-toStdPX 'R' = "R"-toStdPX 'S' = "S"-toStdPX 'T' = "T"-toStdPX 'V' = "V"-toStdPX 'W' = "W"-toStdPX 'Y' = "Y"-toStdPX '-' = ""-toStdPX '.' = ""-toStdPX _ = error "toStdPX: Cannot convert to standard amino acid."--proteinS :: AlphabetSpec-proteinS = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." [] "*" toStdPS--toStdPS :: Char -> String-toStdPS 'A' = "A"-toStdPS 'C' = "C"-toStdPS 'D' = "D"-toStdPS 'E' = "E"-toStdPS 'F' = "F"-toStdPS 'G' = "G"-toStdPS 'H' = "H"-toStdPS 'I' = "I"-toStdPS 'K' = "K"-toStdPS 'L' = "L"-toStdPS 'M' = "M"-toStdPS 'N' = "N"-toStdPS 'P' = "P"-toStdPS 'Q' = "Q"-toStdPS 'R' = "R"-toStdPS 'S' = "S"-toStdPS 'T' = "T"-toStdPS 'V' = "V"-toStdPS 'W' = "W"-toStdPS 'Y' = "Y"-toStdPS '-' = ""-toStdPS '.' = ""-toStdPS '*' = ""-toStdPS _ = error "toStdPS: Cannot convert to standard amino acid."--proteinI :: AlphabetSpec-proteinI = fromChars "ACDEFGHIKLMNPQRSTVWY" "-." "X?" "*JBZ" toStdPI--toStdPI :: Char -> String-toStdPI 'A' = "A"-toStdPI 'C' = "C"-toStdPI 'D' = "D"-toStdPI 'E' = "E"-toStdPI 'F' = "F"-toStdPI 'G' = "G"-toStdPI 'H' = "H"-toStdPI 'I' = "I"-toStdPI 'K' = "K"-toStdPI 'L' = "L"-toStdPI 'M' = "M"-toStdPI 'N' = "N"-toStdPI 'P' = "P"-toStdPI 'Q' = "Q"-toStdPI 'R' = "R"-toStdPI 'S' = "S"-toStdPI 'T' = "T"-toStdPI 'V' = "V"-toStdPI 'W' = "W"-toStdPI 'Y' = "Y"-toStdPI '-' = ""-toStdPI '.' = ""-toStdPI '*' = ""-toStdPI 'J' = "LI"-toStdPI 'B' = "DN"-toStdPI 'Z' = "EQ"-toStdPI 'X' = "ACDEFGHIKLMNPQRSTVWY"-toStdPI '?' = "ACDEFGHIKLMNPQRSTVWY"-toStdPI _ = error "toStdPI: Cannot convert to standard amino acid."
− src/ELynx/Data/Alphabet/Character.hs
@@ -1,76 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.Alphabet.Character--- Description :  Alphabet characters--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Sun May 19 21:06:38 2019.-module ELynx.Data.Alphabet.Character-  ( Character,-    toWord,-    fromWord,-    toChar,-    fromChar,-    toString,-    fromString,-    toCVec,-    fromCVec,-  )-where--import Data.ByteString.Internal (c2w, w2c)-import qualified Data.Vector.Unboxed as V-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Alphabet characters; abstracted so that representation can be changed at--- some point.-newtype Character = Character Word8-  deriving (Read, Show, Eq, Ord, Bounded)--derivingUnbox-  "Character"-  [t|Character -> Word8|]-  [|\(Character w) -> w|]-  [|Character|]---- | Conversion of 'Character's.-toWord :: Character -> Word8-toWord (Character w) = w---- | Conversion of 'Character's.-fromWord :: Word8 -> Character-fromWord = Character---- | Conversion of 'Character's.-toChar :: Character -> Char-toChar (Character w) = w2c w---- | Conversion of 'Character's.-fromChar :: Char -> Character-fromChar = Character . c2w---- | Conversion of 'Character's.-toString :: [Character] -> String-toString = map toChar---- | Conversion of 'Character's.-fromString :: String -> [Character]-fromString = map fromChar---- | Conversion of 'Character's.-toCVec :: C.Character a => V.Vector Character -> V.Vector a-toCVec = V.map (C.fromWord . toWord)---- | Conversion of 'Character's.-fromCVec :: C.Character a => V.Vector a -> V.Vector Character-fromCVec = V.map (fromWord . C.toWord)
− src/ELynx/Data/Alphabet/DistributionDiversity.hs
@@ -1,110 +0,0 @@-{-# LANGUAGE FlexibleContexts #-}---- |--- Module      :  ELynx.Data.Alphabet.DistributionDiversity--- Description :  Summarize statistics for alphabets--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Mon Feb 25 13:32:56 2019.-module ELynx.Data.Alphabet.DistributionDiversity-  ( -- * Entropy-    entropy,-    kEffEntropy,--    -- * Homoplasy-    homoplasy,-    kEffHomoplasy,--    -- * Count characters-    frequencyCharacters,-  )-where--import qualified Data.Set as S-import Data.Vector.Generic-  ( Vector,-    toList,-  )-import qualified Data.Vector.Generic as V-import ELynx.Data.Alphabet.Alphabet-import ELynx.Data.Alphabet.Character--eps :: Double-eps = 1e-12---- Calculate x*log(x) but set to 0.0 when x is smaller than 'eps'.-xLogX :: Double -> Double-xLogX x-  | x < 0.0 = error "Argument lower than zero."-  | eps > x = 0.0-  | otherwise = x * log x---- | Entropy of vector.-entropy :: (Vector v Double) => v Double -> Double-entropy v =-  if isNaN res-    then-      error-        ("entropy: Sesult of following vector is NaN: " ++ show (toList v) ++ ".")-    else res-  where-    res = negate $ V.sum $ V.map xLogX v---- | Effective number of used characters measured using 'entropy'. The result--- only makes sense when the sum of the array is 1.0.-kEffEntropy :: Vector v Double => v Double -> Double-kEffEntropy v = if e < eps then 1.0 else exp e where e = entropy v---- | Probability of homoplasy of vector. The result is the probability of--- binomially sampling the same character twice and only makes sense when the--- sum of the array is 1.0.-homoplasy :: Vector v Double => v Double -> Double-homoplasy v = V.sum $ V.map (\x -> x * x) v---- | Effective number of used characters measured using 'homoplasy'. The result--- only makes sense when the sum of the array is 1.0.-kEffHomoplasy :: Vector v Double => v Double -> Double-kEffHomoplasy v = 1.0 / homoplasy v---- XXX: Use mutable vector; then V.// is much faster.--- Increment element at index in vector by one.-incrementElemIndexByOne :: Vector v Int => [Int] -> v Int -> v Int-incrementElemIndexByOne is v = v V.// zip is es'-  where-    es' = [v V.! i + 1 | i <- is]---- For a given code and counts vector, increment the count of the given character.-acc :: Vector v Int => AlphabetSpec -> v Int -> Character -> v Int-acc alph vec char = incrementElemIndexByOne is vec-  where-    is = [S.findIndex c (std alph) | c <- toStd alph char]--countCharacters ::-  (Vector v Character, Vector v Int) => AlphabetSpec -> v Character -> v Int-countCharacters alph = V.foldl' (acc alph) zeroCounts-  where-    nChars = length (std alph)-    zeroCounts = V.replicate nChars (0 :: Int)--saveDivision :: Int -> Int -> Double-saveDivision value divisor =-  if divisor == 0 then 0.0 else fromIntegral value / fromIntegral divisor---- | For a given code vector of characters, calculate frequency of characters.--- The input vector has arbitrary length (most often the number of sequences in--- an alignment), the length of the output vector is the number of characters in--- the alphabet.-frequencyCharacters ::-  (Vector v Character, Vector v Int, Vector v Double) =>-  AlphabetSpec ->-  v Character ->-  v Double-frequencyCharacters alph d = V.map (`saveDivision` s) counts-  where-    counts = countCharacters alph d-    s = V.sum counts
− src/ELynx/Data/Character/AminoAcid.hs
@@ -1,113 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.AminoAcid--- Description :  Amino acid related types and functions--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ Amino acids in alphabetical order.------ @--- Amino Acid Code:  Three letter Code:  Amino Acid:--- ----------------  ------------------  -------------- A                 Ala                 Alanine--- C                 Cys                 Cysteine--- D                 Asp                 Aspartic Acid--- E                 Glu                 Glutamic Acid--- F                 Phe                 Phenylalanine--- G                 Gly                 Glycine--- H                 His                 Histidine--- I                 Ile                 Isoleucine--- K                 Lys                 Lysine--- L                 Leu                 Leucine--- M                 Met                 Methionine--- N                 Asn                 Asparagine--- P                 Pro                 Proline--- Q                 Gln                 Glutamine--- R                 Arg                 Arginine--- S                 Ser                 Serine--- T                 Thr                 Threonine--- V                 Val                 Valine--- W                 Trp                 Tryptophan--- Y                 Tyr                 Tyrosine--- @-module ELynx.Data.Character.AminoAcid-  ( AminoAcid (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Amino acids.-data AminoAcid = A | C | D | E | F | G | H | I | K | L | M | N | P | Q | R | S | T | V | W | Y-  deriving (Show, Read, Eq, Ord, Enum, Bounded)--toWord :: AminoAcid -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord D = c2w 'D'-toWord E = c2w 'E'-toWord F = c2w 'F'-toWord G = c2w 'G'-toWord H = c2w 'H'-toWord I = c2w 'I'-toWord K = c2w 'K'-toWord L = c2w 'L'-toWord M = c2w 'M'-toWord N = c2w 'N'-toWord P = c2w 'P'-toWord Q = c2w 'Q'-toWord R = c2w 'R'-toWord S = c2w 'S'-toWord T = c2w 'T'-toWord V = c2w 'V'-toWord W = c2w 'W'-toWord Y = c2w 'Y'--fromWord :: Word8 -> AminoAcid-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'D' -> D-  'E' -> E-  'F' -> F-  'G' -> G-  'H' -> H-  'I' -> I-  'K' -> K-  'L' -> L-  'M' -> M-  'N' -> N-  'P' -> P-  'Q' -> Q-  'R' -> R-  'S' -> S-  'T' -> T-  'V' -> V-  'W' -> W-  'Y' -> Y-  _ -> error "fromWord: Cannot convert to AminoAcid."--derivingUnbox-  "AminoAcid"-  [t|AminoAcid -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character AminoAcid where-  toWord = toWord-  fromWord = fromWord
− src/ELynx/Data/Character/AminoAcidI.hs
@@ -1,212 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.AminoAcid--- Description :  Amino acid related types and functions--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ Amino acid IUPAC code. See also https://www.bioinformatics.org/sms/iupac.html or--- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.------ Remarks:------ - Question marks (@?@) are interpreted as unknowns (same as @X@). However, when---   a sequence is printed/exported, @X@s will be used.------ - Full stops (@.@) are interpreted as gaps (same as @-@). However, when a---   sequence is printed/exported, @-@s will be used------ @--- Amino Acid Code:  Three letter Code:  Amino Acid:--- ----------------  ------------------  -------------- A                 Ala                 Alanine--- C                 Cys                 Cysteine--- D                 Asp                 Aspartic Acid--- E                 Glu                 Glutamic Acid--- F                 Phe                 Phenylalanine--- G                 Gly                 Glycine--- H                 His                 Histidine--- I                 Ile                 Isoleucine--- K                 Lys                 Lysine--- L                 Leu                 Leucine--- M                 Met                 Methionine--- N                 Asn                 Asparagine--- P                 Pro                 Proline--- Q                 Gln                 Glutamine--- R                 Arg                 Arginine--- S                 Ser                 Serine--- T                 Thr                 Threonine--- V                 Val                 Valine--- W                 Trp                 Tryptophan--- Y                 Tyr                 Tyrosine--- ----------------  ------------------  -------------- J                                     Leucine or Isoleucine--- B                 Asx                 Aspartic acid or Asparagine--- Z                 Glx                 Glutamine or Glutamic acid--- ----------------  ------------------  -------------- X                 Xaa                 Any amino acid (preferred; used for printing)--- ?                 Xaa                 Any amino acid--- ----------------  ------------------  -------------- *                 Stp                 No amino acid--- ----------------  ------------------  -------------- -                 Gap                 No amino acid (preferred; used for printing)--- .                 Gap                 No amino acid--- @-module ELynx.Data.Character.AminoAcidI-  ( AminoAcidI (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Amino acids.-data AminoAcidI-  = A-  | C-  | D-  | E-  | F-  | G-  | H-  | I-  | K-  | L-  | M-  | N-  | P-  | Q-  | R-  | S-  | T-  | V-  | W-  | Y-  | J-  | B-  | Z-  | X-  | Stop-  | Gap-  deriving (Show, Read, Eq, Ord, Enum, Bounded)--toWord :: AminoAcidI -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord D = c2w 'D'-toWord E = c2w 'E'-toWord F = c2w 'F'-toWord G = c2w 'G'-toWord H = c2w 'H'-toWord I = c2w 'I'-toWord K = c2w 'K'-toWord L = c2w 'L'-toWord M = c2w 'M'-toWord N = c2w 'N'-toWord P = c2w 'P'-toWord Q = c2w 'Q'-toWord R = c2w 'R'-toWord S = c2w 'S'-toWord T = c2w 'T'-toWord V = c2w 'V'-toWord W = c2w 'W'-toWord Y = c2w 'Y'-toWord J = c2w 'J'-toWord B = c2w 'B'-toWord Z = c2w 'Z'-toWord X = c2w 'X'-toWord Stop = c2w '*'-toWord Gap = c2w '-'--fromWord :: Word8 -> AminoAcidI-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'D' -> D-  'E' -> E-  'F' -> F-  'G' -> G-  'H' -> H-  'I' -> I-  'K' -> K-  'L' -> L-  'M' -> M-  'N' -> N-  'P' -> P-  'Q' -> Q-  'R' -> R-  'S' -> S-  'T' -> T-  'V' -> V-  'W' -> W-  'Y' -> Y-  'J' -> J-  'B' -> B-  'Z' -> Z-  'X' -> X-  -- Question marks code for @X@s.-  '?' -> X-  '*' -> Stop-  '-' -> Gap-  -- Full stops code for gaps (@-@s).-  '.' -> Gap-  _ -> error "fromWord: Cannot convert Word8 to AminoAcidI"--derivingUnbox-  "AminoAcidI"-  [t|AminoAcidI -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character AminoAcidI where-  toWord = toWord-  fromWord = fromWord--instance C.CharacterX AminoAcidI where-  gap = Gap--toStandard :: AminoAcidI -> [AminoAcidI]-toStandard A = [A]-toStandard C = [C]-toStandard D = [D]-toStandard E = [E]-toStandard F = [F]-toStandard G = [G]-toStandard H = [H]-toStandard I = [I]-toStandard K = [K]-toStandard L = [L]-toStandard M = [M]-toStandard N = [N]-toStandard P = [P]-toStandard Q = [Q]-toStandard R = [R]-toStandard S = [S]-toStandard T = [T]-toStandard V = [V]-toStandard W = [W]-toStandard Y = [Y]-toStandard J = [L, I]-toStandard B = [D, N]-toStandard Z = [E, Q]-toStandard X = [A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y]-toStandard Stop = []-toStandard Gap = []--instance C.CharacterI AminoAcidI where-  unknown = X-  iupac = [J, B, Z, X]-  toStandard = toStandard
− src/ELynx/Data/Character/AminoAcidS.hs
@@ -1,148 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.AminoAcid--- Description :  Amino acid related types and functions--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ Amino acids with gaps and translation stops.------ @--- Amino Acid Code:  Three letter Code:  Amino Acid:--- ----------------  ------------------  -------------- A                 Ala                 Alanine--- C                 Cys                 Cysteine--- D                 Asp                 Aspartic Acid--- E                 Glu                 Glutamic Acid--- F                 Phe                 Phenylalanine--- G                 Gly                 Glycine--- H                 His                 Histidine--- I                 Ile                 Isoleucine--- K                 Lys                 Lysine--- L                 Leu                 Leucine--- M                 Met                 Methionine--- N                 Asn                 Asparagine--- P                 Pro                 Proline--- Q                 Gln                 Glutamine--- R                 Arg                 Arginine--- S                 Ser                 Serine--- T                 Thr                 Threonine--- V                 Val                 Valine--- W                 Trp                 Tryptophan--- Y                 Tyr                 Tyrosine--- ----------------  ------------------  -------------- *                 Stp                 No amino acid--- ----------------  ------------------  -------------- -                 Gap                 No amino acid (preferred)--- .                 Gap                 No amino acid--- @-module ELynx.Data.Character.AminoAcidS-  ( AminoAcidS (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Amino acids.-data AminoAcidS-  = A-  | C-  | D-  | E-  | F-  | G-  | H-  | I-  | K-  | L-  | M-  | N-  | P-  | Q-  | R-  | S-  | T-  | V-  | W-  | Y-  | Stop-  | Gap-  deriving (Show, Read, Eq, Ord, Enum, Bounded)--toWord :: AminoAcidS -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord D = c2w 'D'-toWord E = c2w 'E'-toWord F = c2w 'F'-toWord G = c2w 'G'-toWord H = c2w 'H'-toWord I = c2w 'I'-toWord K = c2w 'K'-toWord L = c2w 'L'-toWord M = c2w 'M'-toWord N = c2w 'N'-toWord P = c2w 'P'-toWord Q = c2w 'Q'-toWord R = c2w 'R'-toWord S = c2w 'S'-toWord T = c2w 'T'-toWord V = c2w 'V'-toWord W = c2w 'W'-toWord Y = c2w 'Y'-toWord Stop = c2w '*'-toWord Gap = c2w '-'--fromWord :: Word8 -> AminoAcidS-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'D' -> D-  'E' -> E-  'F' -> F-  'G' -> G-  'H' -> H-  'I' -> I-  'K' -> K-  'L' -> L-  'M' -> M-  'N' -> N-  'P' -> P-  'Q' -> Q-  'R' -> R-  'S' -> S-  'T' -> T-  'V' -> V-  'W' -> W-  'Y' -> Y-  '*' -> Stop-  '-' -> Gap-  '.' -> Gap-  _ -> error "fromWord: Cannot convert to AminoAcidS."--derivingUnbox-  "AminoAcidS"-  [t|AminoAcidS -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character AminoAcidS where-  toWord = toWord-  fromWord = fromWord--instance C.CharacterX AminoAcidS where-  gap = Gap
− src/ELynx/Data/Character/AminoAcidX.hs
@@ -1,145 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.AminoAcid--- Description :  Amino acid related types and functions--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ Extended amino acid with gaps. See also--- https://www.bioinformatics.org/sms/iupac.html or--- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.------ @--- Amino Acid Code:  Three letter Code:  Amino Acid:--- ----------------  ------------------  -------------- A                 Ala                 Alanine--- C                 Cys                 Cysteine--- D                 Asp                 Aspartic Acid--- E                 Glu                 Glutamic Acid--- F                 Phe                 Phenylalanine--- G                 Gly                 Glycine--- H                 His                 Histidine--- I                 Ile                 Isoleucine--- K                 Lys                 Lysine--- L                 Leu                 Leucine--- M                 Met                 Methionine--- N                 Asn                 Asparagine--- P                 Pro                 Proline--- Q                 Gln                 Glutamine--- R                 Arg                 Arginine--- S                 Ser                 Serine--- T                 Thr                 Threonine--- V                 Val                 Valine--- W                 Trp                 Tryptophan--- Y                 Tyr                 Tyrosine--- ----------------  ------------------  -------------- -                 Gap                 No amino acid--- .                 Gap                 No amino acid--- @-module ELynx.Data.Character.AminoAcidX-  ( AminoAcidX (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Amino acids.-data AminoAcidX-  = A-  | C-  | D-  | E-  | F-  | G-  | H-  | I-  | K-  | L-  | M-  | N-  | P-  | Q-  | R-  | S-  | T-  | V-  | W-  | Y-  | Gap-  deriving (Show, Read, Eq, Ord, Enum, Bounded)--toWord :: AminoAcidX -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord D = c2w 'D'-toWord E = c2w 'E'-toWord F = c2w 'F'-toWord G = c2w 'G'-toWord H = c2w 'H'-toWord I = c2w 'I'-toWord K = c2w 'K'-toWord L = c2w 'L'-toWord M = c2w 'M'-toWord N = c2w 'N'-toWord P = c2w 'P'-toWord Q = c2w 'Q'-toWord R = c2w 'R'-toWord S = c2w 'S'-toWord T = c2w 'T'-toWord V = c2w 'V'-toWord W = c2w 'W'-toWord Y = c2w 'Y'-toWord Gap = c2w '-'--fromWord :: Word8 -> AminoAcidX-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'D' -> D-  'E' -> E-  'F' -> F-  'G' -> G-  'H' -> H-  'I' -> I-  'K' -> K-  'L' -> L-  'M' -> M-  'N' -> N-  'P' -> P-  'Q' -> Q-  'R' -> R-  'S' -> S-  'T' -> T-  'V' -> V-  'W' -> W-  'Y' -> Y-  '-' -> Gap-  '.' -> Gap-  _ -> error "fromWord: Cannot convert to AminoAcidX."--derivingUnbox-  "AminoAcidX"-  [t|AminoAcidX -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character AminoAcidX where-  toWord = toWord-  fromWord = fromWord--instance C.CharacterX AminoAcidX where-  gap = Gap
− src/ELynx/Data/Character/Character.hs
@@ -1,94 +0,0 @@--- |--- Module      :  Character--- Description :  Character interface--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Oct 12 16:24:02 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.-module ELynx.Data.Character.Character-  ( Character (..),-    fromChar,-    toChar,-    fromString,-    toString,-    CharacterX (..),-    isGap,-    CharacterI (..),-    isUnknown,-    isIUPAC,-    isStandard,-    convert,-  )-where--import Data.ByteString.Internal (c2w, w2c)-import qualified Data.Set as S-import Data.Vector.Unboxed.Base (Unbox)-import Data.Word8 (Word8)---- XXX: Remove name clash with ELynx.Data.Alphabet.Alphabet.Character?---- | A set of characters forms an 'ELynx.Data.Alphabet.Alphabet'. At the--- moment, 'Word8' is used, since none of the alphabets has more than 255--- characters.-class (Show a, Read a, Eq a, Ord a, Enum a, Bounded a, Unbox a) => Character a where-  -- | Write characters.-  toWord :: a -> Word8--  -- | Read characters.-  fromWord :: Word8 -> a---- | Conversion to 'Char'.-toChar :: Character a => a -> Char-toChar = w2c . toWord---- | Conversion from 'Char'.-fromChar :: Character a => Char -> a-fromChar = fromWord . c2w---- | Conversion to 'String'.-toString :: Character a => [a] -> String-toString = map toChar---- | Conversion from 'String'.-fromString :: Character a => String -> [a]-fromString = map fromChar---- | An extended character type with gaps and unknowns.-class Character a => CharacterX a where-  gap :: a---- | Is the character a gap or unknown?-isGap :: CharacterX a => a -> Bool-isGap c = c == gap---- | IUPAC characters with a mapping to extended characters.-class CharacterX a => CharacterI a where-  unknown :: a-  iupac :: [a]-  toStandard :: a -> [a]---- | Check if a IUPAC 'CharacterI' is unknown (e.g., N for nucleotides).-isUnknown :: CharacterI a => a -> Bool-isUnknown c = c == unknown--iupacLookup :: CharacterI a => S.Set a-iupacLookup = S.fromList iupac---- | Is the given character a IUPAC character?-isIUPAC :: CharacterI a => a -> Bool-isIUPAC c = c `S.member` iupacLookup---- | Is the given character a standard character?-isStandard :: CharacterI a => a -> Bool-isStandard c = not $ isIUPAC c---- | Convert between character classes. May throw error.-convert :: (Character a, Character b) => a -> b-convert = fromWord . toWord
− src/ELynx/Data/Character/Codon.hs
@@ -1,258 +0,0 @@-{-# LANGUAGE DeriveGeneric #-}---- |--- Module      :  ELynx.Data.Character.Codon--- Description :  Codons are triplets of nucleotides--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu May 16 07:58:50 2019.------ The different universal codes.--- - https://www.ncbi.nlm.nih.gov/Taxonomy/Utils/wprintgc.cgi?mode=c--- - http://www.bioinformatics.org/sms2/genetic_code.html--- - https://en.wikipedia.org/wiki/Genetic_code-module ELynx.Data.Character.Codon-  ( Codon (Codon),-    fromVecUnsafe,-    UniversalCode (..),-    translate,-    translateX,-    translateI,-  )-where--import Data.Aeson-  ( FromJSON,-    ToJSON,-  )-import Data.List-import qualified Data.Map as M-import qualified Data.Vector.Generic as V-import qualified ELynx.Data.Character.AminoAcidI as AI-import ELynx.Data.Character.AminoAcidS-import qualified ELynx.Data.Character.Character as C-import qualified ELynx.Data.Character.Nucleotide as N-import qualified ELynx.Data.Character.NucleotideI as NI-import qualified ELynx.Data.Character.NucleotideX as NX-import GHC.Generics (Generic)---- | Codons are triplets of characters.-newtype Codon a = Codon (a, a, a)-  deriving (Show, Read, Eq, Ord)--convert :: (C.Character a, C.Character b) => Codon a -> Codon b-convert (Codon (x, y, z)) = Codon (C.convert x, C.convert y, C.convert z)---- | Unsafe conversion from vector with at least three elements; only the first--- three elements are used, the rest is discarded.-fromVecUnsafe :: V.Vector v a => v a -> Codon a-fromVecUnsafe xs =-  Codon (V.head xs, V.head . V.tail $ xs, V.head . V.tail . V.tail $ xs)---- | Universal codes.-data UniversalCode = Standard | VertebrateMitochondrial-  deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic)--instance FromJSON UniversalCode--instance ToJSON UniversalCode---- It is important that the map is lazy, because some keys have errors as values.-mapFromLists :: Ord a => [a] -> [a] -> [a] -> [b] -> M.Map (Codon a) b-mapFromLists xs ys zs as =-  M.fromList $ zipWith4 (\f s t a -> (Codon (f, s, t), a)) xs ys zs as--nucs :: Enum a => [a]-nucs = map toEnum [3, 1, 0, 2] -- Order T, C, A , G.---- Permutation of the triplets PLUS GAPS! I avoid 'Z' because I do not want to--- translate DNAI.-base1, base2, base3 :: Enum a => [a]-base1 = [n | n <- nucs, _ <- [0 .. 3 :: Int], _ <- [0 .. 3 :: Int]]--- base1 = "TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG" ++ "-."-base2 = [n | _ <- [0 .. 3 :: Int], n <- nucs, _ <- [0 .. 3 :: Int]]--- base2 = "TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG" ++ "-."-base3 = [n | _ <- [0 .. 3 :: Int], _ <- [0 .. 3 :: Int], n <- nucs]---- base3 = "TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG" ++ "-."---- The actual codes.-standard :: [AminoAcidS]-standard =-  [ F,-    F,-    L,-    L,-    S,-    S,-    S,-    S,-    Y,-    Y,-    Stop,-    Stop,-    C,-    C,-    Stop,-    W,-    L,-    L,-    L,-    L,-    P,-    P,-    P,-    P,-    H,-    H,-    Q,-    Q,-    R,-    R,-    R,-    R,-    I,-    I,-    I,-    M,-    T,-    T,-    T,-    T,-    N,-    N,-    K,-    K,-    S,-    S,-    R,-    R,-    V,-    V,-    V,-    V,-    A,-    A,-    A,-    A,-    D,-    D,-    E,-    E,-    G,-    G,-    G,-    G-  ]---- "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG" ++ "--"--vertebrateMitochondrial :: [AminoAcidS]-vertebrateMitochondrial =-  [ F,-    F,-    L,-    L,-    S,-    S,-    S,-    S,-    Y,-    Y,-    Stop,-    Stop,-    C,-    C,-    W,-    W,-    L,-    L,-    L,-    L,-    P,-    P,-    P,-    P,-    H,-    H,-    Q,-    Q,-    R,-    R,-    R,-    R,-    I,-    I,-    M,-    M,-    T,-    T,-    T,-    T,-    N,-    N,-    K,-    K,-    S,-    S,-    Stop,-    Stop,-    V,-    V,-    V,-    V,-    A,-    A,-    A,-    A,-    D,-    D,-    E,-    E,-    G,-    G,-    G,-    G-  ]---- "FFLLSSSSYY**CCWWLLLLPPPPHHQQRRRRIIMMTTTTNNKKSS**VVVVAAAADDEEGGGG" ++ "--"---- | Translate a codon to amino acids including translation stops.-translate :: UniversalCode -> Codon N.Nucleotide -> AminoAcidS-translate code = (M.!) (universalCode code)---- | Translate a codon to amino acids including translation stops. Translate--- codons including gaps to amino acid gaps. Be careful, single or two character--- gaps can lead to a reading frame shift and hence, the translated sequence may--- be bogus.-translateX :: UniversalCode -> Codon NX.NucleotideX -> AminoAcidS--- translateX _ (Codon (NX.Gap, NX.Gap, NX.Gap)) = Gap--- translateX code codon                         = C.convert . translate code . convert $ codon-translateX code codon@(Codon (x, y, z))-  | C.isGap x || C.isGap y || C.isGap z = Gap-  | otherwise = C.convert . translate code . convert $ codon---- | Translate a codon to amino acids including translation stops. Translate gap--- triplets to amino acid gaps, and triplets including unknowns to amino acid--- unknowns. Be careful, also translates other IUPAC characters to amino acid Xs!-translateI :: UniversalCode -> Codon NI.NucleotideI -> AI.AminoAcidI-translateI code codon@(Codon (x, y, z))-  | C.isIUPAC x || C.isIUPAC y || C.isIUPAC z = AI.X-  | otherwise = C.convert . translateX code . convert $ codon---- translateI :: UniversalCode -> Codon NI.NucleotideI -> AI.AminoAcidI--- translateI _ (Codon (NI.N, _,    _   )) = AI.X--- translateI _ (Codon (_   , NI.N, _   )) = AI.X--- translateI _ (Codon (_,    _,    NI.N)) = AI.X--- translateI code codon                   = C.convert . translateX code . convert $ codon---- Map from 'Codon' to amino acid character.-universalCode :: UniversalCode -> M.Map (Codon N.Nucleotide) AminoAcidS-universalCode Standard = mapFromLists base1 base2 base3 standard-universalCode VertebrateMitochondrial =-  mapFromLists base1 base2 base3 vertebrateMitochondrial
− src/ELynx/Data/Character/Nucleotide.hs
@@ -1,67 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.Nucleotide--- Description :  Nucleotides--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ @--- Symbol  Description  Bases represented  Complement--- ------  -----------  -----------------  ------------- A       Adenine      A                  T--- C       Cytosine        C               G--- G       Guanine            G            C--- T       Thymine               T         A--- @-module ELynx.Data.Character.Nucleotide-  ( Nucleotide (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Nucleotides.-data Nucleotide = A | C | G | T-  deriving (Show, Read, Eq, Ord, Enum, Bounded)---- See https://stackoverflow.com/a/31527024; apparently, pattern matching (and--- case statements) are fast because they are compiled to lookup tables. Hence,--- they are faster than guards (because equality has to be checked), and faster--- than lookups with sets.-toWord :: Nucleotide -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord G = c2w 'G'-toWord T = c2w 'T'--fromWord :: Word8 -> Nucleotide-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'G' -> G-  'T' -> T-  c -> error $ "fromWord: Cannot convert " ++ show c ++ " to Nucleotide."--derivingUnbox-  "Nucleotide"-  [t|Nucleotide -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character Nucleotide where-  toWord = toWord-  fromWord = fromWord
− src/ELynx/Data/Character/NucleotideI.hs
@@ -1,168 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.NucleotideI--- Description :  Nucleotides with IUPAC characters--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:26:35 2018.------ See header of 'ELynx.Data.Alphabet.Alphabet'.------ Nucleotide IUPAC code. See also https://www.bioinformatics.org/sms/iupac.html or--- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.------ Remarks:------ - Question marks (@?@) are interpreted as unknowns (same as @N@). However, when---   a sequence is printed/exported, @N@s will be used.------ - Full stops (@.@) are interpreted as gaps (same as @-@). However, when a---   sequence is printed/exported, @-@s will be used------ @--- Symbol  Description  Bases represented  Complement--- ------  -----------  -----------------  ------------- A       Adenine      A                  T--- C       Cytosine        C               G--- G       Guanine            G            C--- T       Thymine               T         A--- ------  -----------  -----------------  ------------- U       Uracil                U         A--- W       Weak         A        T         W--- S       Strong          C  G            S--- M       aMino        A  C               K--- K       Keto               G  T         M--- R       puRine       A     G            Y--- Y       pYrimidine      C     T         R--- B       not A           C  G  T         V--- D       not C        A     G  T         H--- H       not G        A  C     T         D--- V       not T        A  C  G            B--- ------  -----------  -----------------  ------------- N       any          A  C  G  T         N           (preferred)--- ?       any          A  C  G  T         N--- ------  -----------  -----------------  ------------- -       Gap (Zero)                      -           (preferred)--- .       Gap (Zero)                      ---- @-module ELynx.Data.Character.NucleotideI-  ( NucleotideI (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | NucleotideIs.-data NucleotideI-  = A-  | C-  | G-  | T-  | U-  | W-  | S-  | M-  | K-  | R-  | Y-  | B-  | D-  | H-  | V-  | N-  | Gap-  deriving (Show, Read, Eq, Ord, Enum, Bounded)---- See https://stackoverflow.com/a/31527024; apparently, pattern matching (and--- case statements) are fast because they are compiled to lookup tables. Hence,--- they are faster than guards (because equality has to be checked), and faster--- than lookups with sets.-toWord :: NucleotideI -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord G = c2w 'G'-toWord T = c2w 'T'-toWord U = c2w 'U'-toWord W = c2w 'W'-toWord S = c2w 'S'-toWord M = c2w 'M'-toWord K = c2w 'K'-toWord R = c2w 'R'-toWord Y = c2w 'Y'-toWord B = c2w 'B'-toWord D = c2w 'D'-toWord H = c2w 'H'-toWord V = c2w 'V'-toWord N = c2w 'N'-toWord Gap = c2w '-'--fromWord :: Word8 -> NucleotideI-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'G' -> G-  'T' -> T-  'U' -> U-  'W' -> W-  'S' -> S-  'M' -> M-  'K' -> K-  'R' -> R-  'Y' -> Y-  'B' -> B-  'D' -> D-  'H' -> H-  'V' -> V-  'N' -> N-  '?' -> N-  '-' -> Gap-  '.' -> Gap-  _ -> error "fromWord: Cannot convert to NucleotideI."--derivingUnbox-  "NucleotideI"-  [t|NucleotideI -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character NucleotideI where-  toWord = toWord-  fromWord = fromWord--toStandard :: NucleotideI -> [NucleotideI]-toStandard A = [A]-toStandard C = [C]-toStandard G = [G]-toStandard T = [T]-toStandard U = [T]-toStandard W = [A, T]-toStandard S = [G, C]-toStandard M = [A, C]-toStandard K = [G, T]-toStandard R = [A, G]-toStandard Y = [C, T]-toStandard B = [C, G, T]-toStandard D = [A, G, T]-toStandard H = [A, C, T]-toStandard V = [A, C, G]-toStandard N = [A, C, G, T]-toStandard Gap = []--instance C.CharacterX NucleotideI where-  gap = Gap--instance C.CharacterI NucleotideI where-  unknown = N-  iupac = [U, W, S, M, K, R, Y, B, D, H, V, N]-  toStandard = toStandard
− src/ELynx/Data/Character/NucleotideX.hs
@@ -1,79 +0,0 @@-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE TypeFamilies #-}---- |--- Module      :  ELynx.Data.NucleotideX--- Description :  Extended nucleotides including gaps and unknowns--- Copyright   :  (c) Dominik Schrempf 2021------ License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ See header of 'ELynx.Data.Alphabet'.------ Extended nucleotides with gaps. See also--- https://www.bioinformatics.org/sms/iupac.html or--- https://en.wikipedia.org/wiki/International_Union_of_Pure_and_Applied_Chemistry.------ @--- Symbol  Description  Bases represented  Complement--- ------  -----------  -----------------  ------------- A       Adenine      A                  T--- C       Cytosine        C               G--- G       Guanine            G            C--- T       Thymine               T         A--- ------  -----------  -----------------  ------------- - or .  Gap (Zero)                      ---- @-module ELynx.Data.Character.NucleotideX-  ( NucleotideX (..),-  )-where--import Data.ByteString.Internal (c2w, w2c)-import Data.Vector.Unboxed.Deriving-import Data.Word8-import qualified ELynx.Data.Character.Character as C---- | Extended nucleotides.-data NucleotideX-  = A-  | C-  | G-  | T-  | Gap-  deriving (Show, Read, Eq, Ord, Enum, Bounded)--toWord :: NucleotideX -> Word8-toWord A = c2w 'A'-toWord C = c2w 'C'-toWord G = c2w 'G'-toWord T = c2w 'T'-toWord Gap = c2w '-'--fromWord :: Word8 -> NucleotideX-fromWord w = case w2c w of-  'A' -> A-  'C' -> C-  'G' -> G-  'T' -> T-  '-' -> Gap-  '.' -> Gap-  c -> error $ "fromWord: Cannot convert " ++ show c ++ " to NucleotideX."--derivingUnbox-  "NucleotideX"-  [t|NucleotideX -> Word8|]-  [|toWord|]-  [|fromWord|]--instance C.Character NucleotideX where-  toWord = toWord-  fromWord = fromWord--instance C.CharacterX NucleotideX where-  gap = Gap
− src/ELynx/Data/Sequence/Alignment.hs
@@ -1,323 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.Alignment--- Description :  Multi sequence alignment related types and functions--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable------ Portability :  portable------ Creation date: Thu Oct  4 18:40:18 2018.------ This module is to be imported qualified.-module ELynx.Data.Sequence.Alignment-  ( Alignment (..),-    length,-    nSequences,-    -- | * Input, output-    fromSequences,-    toSequences,-    summarize,-    -- | * Manipulation-    join,-    concat,-    concatAlignments,-    filterColsConstant,-    filterColsConstantSoft,-    filterColsOnlyStd,-    filterColsStd,-    filterColsNoGaps,-    -- | * Analysis-    FrequencyData,-    distribution,-    toFrequencyData,-    kEffEntropy,-    kEffHomoplasy,-    countIUPACChars,-    countGaps,-    countUnknowns,-    -- | * Sub sample-    subSample,-    randomSubSample,-  )-where--import Control.Monad hiding (join)-import Control.Monad.Primitive-import Control.Parallel.Strategies-import qualified Data.ByteString.Lazy.Char8 as BL-import Data.List hiding-  ( concat,-    length,-  )-import qualified Data.Matrix.Unboxed as M-import qualified Data.Vector.Unboxed as V-import qualified ELynx.Data.Alphabet.Alphabet as A-import ELynx.Data.Alphabet.Character-import qualified ELynx.Data.Alphabet.DistributionDiversity as D-import ELynx.Data.Sequence.Defaults-import qualified ELynx.Data.Sequence.Sequence as S-import System.Random.MWC-import Prelude hiding-  ( concat,-    length,-  )---- | A collection of sequences.-data Alignment = Alignment-  { names :: [S.Name],-    descriptions :: [S.Description],-    alphabet :: A.Alphabet,-    matrix :: M.Matrix Character-  }-  deriving (Show, Eq)---- | Number of sites.-length :: Alignment -> Int-length = M.cols . matrix---- | Number of sequences.-nSequences :: Alignment -> Int-nSequences = M.rows . matrix---- | Create 'Alignment' from a list of 'S.Sequence's.-fromSequences :: [S.Sequence] -> Either String Alignment-fromSequences ss-  | S.equalLength ss && allEqual (map S.alphabet ss) =-    Right $-      Alignment ns ds a d-  | S.equalLength ss = Left "Sequences do not have equal codes."-  | otherwise = Left "Sequences do not have equal lengths."-  where-    ns = map S.name ss-    ds = map S.description ss-    a = S.alphabet $ head ss-    bss = map S.characters ss-    d = M.fromRows bss-    allEqual [] = True-    allEqual xs = all (== head xs) $ tail xs---- | Conversion to list of 'S.Sequence's.-toSequences :: Alignment -> [S.Sequence]-toSequences (Alignment ns ds a da) =-  zipWith3-    (\n d r -> S.Sequence n d a r)-    ns-    ds-    rows-  where-    rows = M.toRows da--header :: Alignment -> BL.ByteString-header a =-  BL.unlines $-    [ BL.pack "Multi sequence alignment.",-      BL.pack $ "Code: " ++ A.alphabetDescription (alphabet a) ++ ".",-      BL.pack $ "Length: " ++ show (length a) ++ "."-    ]-      ++ reportLengthSummary-      ++ reportNumberSummary-  where-    reportLengthSummary =-      [ BL.pack $-          "For each sequence, the "-            ++ show summaryLength-            ++ " first bases are shown."-        | length a > summaryLength-      ]-    reportNumberSummary =-      [ BL.pack $-          show summaryNSequences-            ++ " out of "-            ++ show (nSequences a)-            ++ " sequences are shown."-        | nSequences a > summaryNSequences-      ]---- | Similar to 'S.summarizeSequenceList' but with different Header.-summarize :: Alignment -> BL.ByteString-summarize a = header a <> S.body (toSequences a)---- Vertical concatenation.-(===) :: V.Unbox a => M.Matrix a -> M.Matrix a -> M.Matrix a-(===) l r = M.fromRows $ lRs ++ rRs-  where-    lRs = M.toRows l-    rRs = M.toRows r---- Horizontal concatenation.-(|||) :: V.Unbox a => M.Matrix a -> M.Matrix a -> M.Matrix a-(|||) l r = M.fromColumns $ lCs ++ rCs-  where-    lCs = M.toColumns l-    rCs = M.toColumns r---- | Join two 'Alignment's vertically. That is, add more sequences--- to an alignment. See also 'concat'.-join :: Alignment -> Alignment -> Alignment--- top bottom.-join t b-  | length t /= length b =-    error-      "join: Multi sequence alignments do not have equal lengths."-  | alphabet t /= alphabet b =-    error-      "join: Multi sequence alignments do not have equal alphabets."-  | otherwise = Alignment ns ds al (tD === bD)-  where-    ns = names t ++ names b-    ds = descriptions t ++ descriptions b-    tD = matrix t-    bD = matrix b-    al = alphabet t---- | Concatenate two 'Alignment's horizontally. That is, add more--- sites to an alignment. See also 'join'.-concat :: Alignment -> Alignment -> Alignment--- left right.-concat l r-  | nSequences l /= nSequences r =-    error-      "concat: Multi sequence alignments do not have an equal number of sequences."-  | alphabet l /= alphabet r =-    error "concat: Multi sequence alignments do not have an equal alphabets."-  | names l /= names r =-    error "concat: Multi sequence alignments do not have an equal names."-  | descriptions l /= descriptions r =-    error "concat: Multi sequence alignments do not have an equal descriptions."-  | otherwise =-    Alignment (names l) (descriptions l) (alphabet l) (lD ||| rD)-  where-    lD = matrix l-    rD = matrix r---- | Concatenate a list of 'Alignment's horizontally. See--- 'concat'.-concatAlignments :: [Alignment] -> Alignment-concatAlignments [] = error "concatAlignments: Nothing to concatenate."-concatAlignments [a] = a-concatAlignments as = foldl' concat (head as) (tail as)---- Only keep columns from alignment that satisfy given predicate.-filterColsWith :: (V.Vector Character -> Bool) -> Alignment -> Alignment-filterColsWith p a = a {matrix = m'}-  where-    m' = M.fromColumns . filter p . M.toColumns $ matrix a---- | Only keep constant columns.-filterColsConstant :: Alignment -> Alignment-filterColsConstant = filterColsWith (\v -> V.all (== V.head v) v)---- | Only keep constant columns, and constant columns with at least one standard--- character as well as any number of gaps or unknowns.-filterColsConstantSoft :: Alignment -> Alignment-filterColsConstantSoft a = filterColsWith f a-  where-    al = alphabet a-    f v = case V.find (A.isStd al) v of-      Nothing -> False-      Just c -> V.all (\x -> x == c || A.isGap al x || A.isUnknown al x) v---- | Only keep columns with standard characters. Alignment columns with IUPAC--- characters are removed.-filterColsOnlyStd :: Alignment -> Alignment-filterColsOnlyStd a = filterColsWith (V.all $ A.isStd (alphabet a)) a---- | Filter columns with proportion of standard character larger than given number.-filterColsStd :: Double -> Alignment -> Alignment-filterColsStd prop a =-  filterColsWith-    (\col -> prop * n <= fromIntegral (V.length (V.filter (A.isStd al) col)))-    a-  where-    al = alphabet a-    n = fromIntegral $ nSequences a---- | Only keep columns without gaps or unknown characters.-filterColsNoGaps :: Alignment -> Alignment-filterColsNoGaps a = filterColsWith (V.all $ not . A.isGap (alphabet a)) a---- | Frequency data; do not store the actual characters, but their frequencies.--- The matrix is of size @N x K@, where @N@ is the number of sites, and @K@ is--- the number of characters.-type FrequencyData = M.Matrix Double---- Map a function on each column of a DIM2 array; parallel version with given chunk size.-fMapColParChunk ::-  (V.Unbox a, V.Unbox b) =>-  Int ->-  (V.Vector a -> V.Vector b) ->-  M.Matrix a ->-  M.Matrix b-fMapColParChunk n f m =-  M.fromColumns (map f (M.toColumns m) `using` parListChunk n rseq)---- | Calculcate frequency of characters at each site of a multi sequence alignment.-toFrequencyData :: Alignment -> FrequencyData-toFrequencyData a = fMapColParChunk 100 (D.frequencyCharacters spec) (matrix a)-  where-    spec = A.alphabetSpec (alphabet a)---- | Calculate the distribution of characters.-distribution :: FrequencyData -> [Double]-distribution fd =-  map (/ fromIntegral nSites) $-    V.toList $-      foldl1-        (V.zipWith (+))-        (M.toColumns fd)-  where-    nSites = M.cols fd---- Parallel map with given chunk size.-parMapChunk :: Int -> (a -> b) -> [a] -> [b]-parMapChunk n f as = map f as `using` parListChunk n rseq--chunksize :: Int-chunksize = 500---- | Diversity analysis. See 'kEffEntropy'.-kEffEntropy :: FrequencyData -> [Double]-kEffEntropy fd = parMapChunk chunksize D.kEffEntropy (M.toColumns fd)---- | Diversity analysis. See 'kEffEntropy'.-kEffHomoplasy :: FrequencyData -> [Double]-kEffHomoplasy fd = parMapChunk chunksize D.kEffHomoplasy (M.toColumns fd)---- | Count the number of standard (i.e., not extended IUPAC) characters in the--- alignment.-countIUPACChars :: Alignment -> Int-countIUPACChars a = V.length . V.filter (A.isIUPAC (alphabet a)) $ allChars-  where-    allChars = M.flatten $ matrix a---- | Count the number of gaps in the alignment.-countGaps :: Alignment -> Int-countGaps a = V.length . V.filter (A.isGap (alphabet a)) $ allChars-  where-    allChars = M.flatten $ matrix a---- | Count the number of unknown characters in the alignment.-countUnknowns :: Alignment -> Int-countUnknowns a = V.length . V.filter (A.isUnknown (alphabet a)) $ allChars-  where-    allChars = M.flatten $ matrix a---- Sample the given sites from a matrix.-subSampleMatrix :: V.Unbox a => [Int] -> M.Matrix a -> M.Matrix a-subSampleMatrix is m =-  M.fromColumns $ foldl' (\a i -> M.takeColumn m i : a) [] (reverse is)---- | Sample the given sites from a multi sequence alignment.-subSample :: [Int] -> Alignment -> Alignment-subSample is a = a {matrix = m'} where m' = subSampleMatrix is $ matrix a---- | Randomly sample a given number of sites of the multi sequence alignment.-randomSubSample ::-  PrimMonad m => Int -> Alignment -> Gen (PrimState m) -> m Alignment-randomSubSample n a g = do-  let l = length a-  is <- replicateM n $ uniformR (0, l - 1) g-  return $ subSample is a
− src/ELynx/Data/Sequence/Defaults.hs
@@ -1,34 +0,0 @@--- |--- Module      :  ELynx.Defaults--- Description :  Various default values--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Oct  5 23:00:17 2018.-module ELynx.Data.Sequence.Defaults-  ( nameWidth,-    summaryLength,-    summaryNSequences,-    fieldWidth,-  )-where---- | Space reserved for sequence names when printing them.-nameWidth :: Int-nameWidth = 23---- | The length shown when summarizing sequences.-summaryLength :: Int-summaryLength = 60---- | How many sequences are shown in summary.-summaryNSequences :: Int-summaryNSequences = 200---- | Field width for tables.-fieldWidth :: Int-fieldWidth = 13
− src/ELynx/Data/Sequence/Distance.hs
@@ -1,33 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.Distance--- Description :  Distance functions between sequences--- Copyright   :  (c) Dominik Schrempf, 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Aug 21 15:09:58 2020.-module ELynx.Data.Sequence.Distance-  ( hamming,-  )-where--import qualified Data.Vector.Unboxed as V-import ELynx.Data.Sequence.Sequence--countFalses :: (Int -> Bool -> Int)-countFalses n False = succ n-countFalses n True = n---- | Compute hamming distance between two sequences.-hamming :: Sequence -> Sequence -> Either String Int-hamming l r-  | alphabet l /= alphabet r = Left "hamming: Alphabets of sequences differ."-  | V.length csL /= V.length csR = Left "hamming: Sequence lengths differ."-  | V.null csL || V.null csR = Left "hamming: Empty sequence encountered."-  | otherwise = Right $ V.foldl' countFalses 0 $ V.zipWith (==) (characters l) (characters r)-  where-    csL = characters l-    csR = characters r
− src/ELynx/Data/Sequence/Sequence.hs
@@ -1,244 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}---- |--- Module      :  ELynx.Data.Sequence--- Description :  Hereditary sequences--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Thu Oct  4 18:54:51 2018.------ This module is to be imported qualified.-module ELynx.Data.Sequence.Sequence-  ( -- * Types-    Name,-    Description,-    Characters,-    Sequence (..),--    -- * Input-    fromByteString,--    -- * Output-    toByteString,-    header,-    summarize,-    summarizeSequences,-    body,--    -- * Analysis-    length,-    equalLength,-    longest,--    -- * Manipulation-    trim,-    concat,-    concatSequences,--    -- * Filtering-    filterShorterThan,-    filterLongerThan,-    filterStandard,-  )-where--import Control.Parallel.Strategies-import qualified Data.ByteString.Lazy.Char8 as BL-import Data.List (maximumBy)-import Data.Ord (comparing)-import qualified Data.Vector.Unboxed as V-import qualified ELynx.Data.Alphabet.Alphabet as A-import ELynx.Data.Alphabet.Character-import ELynx.Data.Sequence.Defaults-import qualified Text.Printf as P-import Prelude hiding-  ( concat,-    length,-  )-import qualified Prelude as Pr-  ( length,-  )---- | For now, 'Name's are just 'BL.ByteString's.-type Name = BL.ByteString---- | The description of a sequence.-type Description = BL.ByteString---- | The vector of characters of a sequence.-type Characters = V.Vector Character---- | Convert byte string to sequence characters.-fromByteString :: BL.ByteString -> Characters-fromByteString = V.fromList . map fromChar . BL.unpack---- | Convert sequence characters to byte string.-toByteString :: Characters -> BL.ByteString-toByteString = BL.pack . map toChar . V.toList---- | Sequences have a name, a possibly empty description, a code and hopefully a--- lot of data.-data Sequence = Sequence-  { name :: Name,-    description :: Description,-    alphabet :: A.Alphabet,-    characters :: Characters-  }-  deriving (Show, Eq)--alignRight :: Int -> BL.ByteString -> BL.ByteString-alignRight n s =-  BL.replicate (fromIntegral n - l) ' ' <> BL.take (fromIntegral n) s-  where-    l = BL.length s--alignLeft :: Int -> BL.ByteString -> BL.ByteString-alignLeft n s =-  BL.take (fromIntegral n) s <> BL.replicate (fromIntegral n - l) ' '-  where-    l = BL.length s--getInfo :: Sequence -> BL.ByteString-getInfo s =-  BL.unwords-    [ alignLeft nameWidth (name s),-      alignRight fieldWidth (BL.pack $ show $ alphabet s),-      alignRight fieldWidth (BL.pack . show $ len),-      alignRight fieldWidth (BL.pack $ P.printf "%2.2f" pGaps)-    ]-  where-    len = length s-    nGaps = countGaps s-    pGaps = 100 * fromIntegral nGaps / fromIntegral len :: Double---- If a string is longer than a given value, trim it and add some dots.-summarizeByteString :: Int -> BL.ByteString -> BL.ByteString-summarizeByteString l s-  | BL.length s >= fromIntegral l = BL.take (fromIntegral l) s <> BL.pack "..."-  | otherwise = s---- | Trim and show a 'Sequence'.-summarize :: Sequence -> BL.ByteString-summarize s =-  BL.unwords-    [getInfo s, summarizeByteString summaryLength $ toByteString (characters s)]---- | Trim and show a list of 'Sequence's.-summarizeSequences :: [Sequence] -> BL.ByteString-summarizeSequences ss = header ss <> body (take summaryNSequences ss)---- | Header printed before 'Sequence' list.-tableHeader :: BL.ByteString-tableHeader =-  BL.unwords-    [ alignLeft nameWidth "Name",-      alignRight fieldWidth "Code",-      alignRight fieldWidth "Length",-      alignRight fieldWidth "Gaps [%]",-      "Sequence"-    ]---- | A short description of the sequence.-header :: [Sequence] -> BL.ByteString-header ss =-  BL.unlines $-    reportIfSubsetIsShown-      ++ [ BL.pack $-             "For each sequence, the "-               ++ show summaryLength-               ++ " first bases are shown.",-           BL.pack $ "List contains " ++ show (Pr.length ss) ++ " sequences.",-           "",-           tableHeader-         ]-  where-    l = Pr.length ss-    s =-      show summaryNSequences-        ++ " out of "-        ++ show (Pr.length ss)-        ++ " sequences are shown."-    reportIfSubsetIsShown-      | l > summaryNSequences = [BL.pack s]-      | otherwise = []---- | Trim and show a list of 'Sequence's.-body :: [Sequence] -> BL.ByteString-body ss = BL.unlines (map summarize ss `using` parListChunk 5 rdeepseq)---- | Calculate length of 'Sequence'.-length :: Sequence -> Int-length = fromIntegral . V.length . characters---- | Check if all 'Sequence's have equal length.-equalLength :: [Sequence] -> Bool-equalLength = allEqual . map length-  where-    allEqual [] = True-    allEqual xs = all (== head xs) $ tail xs---- | Find the longest 'Sequence' in a list.-longest :: [Sequence] -> Sequence-longest = maximumBy (comparing length)---- | Count number of gaps or unknown characters in sequence.-countGaps :: Sequence -> Int-countGaps s = V.length . V.filter (A.isGap $ alphabet s) $ characters s---- | Trim to given length.-trim :: Int -> Sequence -> Sequence-trim n (Sequence nm d a cs) = Sequence nm d a (V.take (fromIntegral n) cs)---- | Concatenate two sequences. 'Name's have to match.-concat :: Sequence -> Sequence -> Sequence-concat (Sequence i d c cs) (Sequence j f k ks)-  | i /= j =-    error $-      "concatenate: Sequences do not have equal names: "-        ++ BL.unpack i-        ++ ", "-        ++ BL.unpack j-        ++ "."-  | d /= f =-    error $-      "concatenate: Sequences do not have equal descriptions: "-        ++ BL.unpack d-        ++ ", "-        ++ BL.unpack f-        ++ "."-  | c /= k =-    error $-      "concatenate: Sequences do not have equal alphabets: "-        ++ show c-        ++ ", "-        ++ show k-        ++ "."-  | otherwise =-    Sequence i d c (cs <> ks)---- | Concatenate a list of sequences, see 'concat'.-concatSequences :: [[Sequence]] -> [Sequence]-concatSequences [] = error "concatenateSequences: Nothing to concatenate."-concatSequences [ss] = ss-concatSequences sss = foldl1 (zipWith concat) sss---- | Only take 'Sequence's that are shorter than a given number.-filterShorterThan :: Int -> [Sequence] -> [Sequence]-filterShorterThan n = filter (\x -> length x < n)---- | Only take 'Sequence's that are longer than a given number.-filterLongerThan :: Int -> [Sequence] -> [Sequence]-filterLongerThan n = filter (\x -> length x > n)---- | Only take 'Sequence's that contain at least on non-IUPAC character.-filterStandard :: [Sequence] -> [Sequence]-filterStandard = filter (\s -> anyStandard (alphabet s) s)---- Are all characters IUPAC characters?-anyStandard :: A.Alphabet -> Sequence -> Bool-anyStandard a s = V.any (A.isStd a) cs where cs = characters s
− src/ELynx/Data/Sequence/Translate.hs
@@ -1,53 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.Translate--- Description :  Translate sequences--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri May 17 13:49:18 2019.-module ELynx.Data.Sequence.Translate-  ( translateSeq,-  )-where--import qualified Data.Vector.Unboxed as V-import ELynx.Data.Alphabet.Alphabet-import qualified ELynx.Data.Alphabet.Character as C-import ELynx.Data.Character.Codon-import ELynx.Data.Sequence.Sequence---- Chop list into chunks of given length. If the last chop is shorter than--- length, it is dropped.-chopVec :: V.Unbox a => Int -> V.Vector a -> [V.Vector a]-chopVec n xs-  | V.length xs < n = []-  | otherwise = V.take n xs : chopVec n (V.drop n xs)---- | Translate a sequence from 'DNA' or 'DNAX' to 'ProteinS'.-translateSeq :: UniversalCode -> Int -> Sequence -> Sequence-translateSeq uc rf (Sequence n d a cs) = case a of-  DNA -> Sequence n d ProteinS (cs' $ translate uc)-  DNAX -> Sequence n d ProteinS (cs' $ translateX uc)-  DNAI -> Sequence n d ProteinI (cs' $ translateI uc)-  _ -> error "translate: can only translate DNA, DNAX, and DNAI."-  where-    cs' f = C.fromCVec $ translateVecWith f rf (C.toCVec cs)---- Translate from DNA to Protein with given reading frame (0, 1, 2).-translateVecWith ::-  (V.Unbox a, Ord a, V.Unbox b) =>-  (Codon a -> b) ->-  Int ->-  V.Vector a ->-  V.Vector b-translateVecWith f rf cs-  | rf > 2 = error "translateVecWith: reading frame is larger than 2."-  | rf < 0 = error "translateVecWith: reading frame is negative."-  | otherwise = aas-  where-    codons = map fromVecUnsafe $ chopVec 3 $ V.drop rf cs-    aas = V.fromList $ map f codons
− src/ELynx/Export/Sequence/Fasta.hs
@@ -1,36 +0,0 @@--- |--- Module      :  ELynx.Export.Sequence.Fasta--- Description :  Export Fasta sequences--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later--------- Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Write FASTA files.------ [NCBI file specifications](https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=BlastHelp).-module ELynx.Export.Sequence.Fasta-  ( sequenceToFasta,-    sequencesToFasta,-  )-where--import qualified Data.ByteString.Lazy.Char8 as BL-import ELynx.Data.Sequence.Sequence--fastaHeader :: BL.ByteString -> BL.ByteString -> BL.ByteString-fastaHeader n d =-  BL.singleton '>' <> n <> if BL.null d then BL.empty else BL.pack " " <> d---- | Convert a 'Sequence' to Fasta format.-sequenceToFasta :: Sequence -> BL.ByteString-sequenceToFasta s =-  BL.unlines [fastaHeader (name s) (description s), toByteString $ characters s]---- | Convert a list 'Sequence's to Fasta format. A newline is added between any--- two 'Sequence's.-sequencesToFasta :: [Sequence] -> BL.ByteString-sequencesToFasta ss = BL.concat $ map sequenceToFasta ss
− src/ELynx/Import/Sequence/Fasta.hs
@@ -1,70 +0,0 @@-{-# LANGUAGE BangPatterns #-}---- |--- Module      :  ELynx.Import.Sequence.Fasta--- Description :  Import Fasta sequences--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later--------- Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Parse FASTA files.------ [NCBI file specifications](https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=BlastHelp).-module ELynx.Import.Sequence.Fasta-  ( fastaSequence,-    fasta,-  )-where--import Control.Applicative-import qualified Data.Attoparsec.ByteString as AS-import qualified Data.Attoparsec.ByteString.Char8 as AC-import qualified Data.ByteString.Lazy.Char8 as BL-import qualified Data.Set as S-import Data.Word8 (Word8)-import ELynx.Data.Alphabet.Alphabet as A-import ELynx.Data.Alphabet.Character-import ELynx.Data.Sequence.Sequence--isSpecial :: Char -> Bool-isSpecial w = w `elem` ['_', '|', '.', '-']--isHeader :: Char -> Bool-isHeader w = AC.isAlpha_ascii w || AC.isDigit w || isSpecial w--sequenceHeader :: AS.Parser (BL.ByteString, BL.ByteString)-sequenceHeader = do-  _ <- AC.char '>'-  n <- AC.takeWhile1 isHeader-  _ <- AS.takeWhile AC.isHorizontalSpace-  d <- AC.takeWhile isHeader-  _ <- AC.endOfLine-  return (BL.fromStrict n, BL.fromStrict d)---- It is a little faster to directly pass the set of allowed characters. Then,--- this set only has to be calculcated once per sequence in 'fastaSequence'.-sequenceLine :: S.Set Word8 -> AS.Parser BL.ByteString-sequenceLine s = do-  -- XXX: Will fail for non-capital letters.-  !xs <- AS.takeWhile1 (`S.member` s)-  return (BL.fromStrict xs)---- XXX: If sequences are parsed line by line, the lines have to be copied when--- forming the complete sequence. This is not memory efficient.---- | Parse a sequence of characters.-fastaSequence :: Alphabet -> AS.Parser Sequence-fastaSequence a = do-  (n, d) <- sequenceHeader-  let !alph = S.map toWord (A.all . alphabetSpec $ a)-  lns <- sequenceLine alph `AS.sepBy1` AC.endOfLine-  _ <- many AC.endOfLine-  return $ Sequence n d a (fromByteString $ BL.concat lns)---- | Parse a Fasta file with given 'Alphabet'.-fasta :: Alphabet -> AS.Parser [Sequence]-fasta a = some (fastaSequence a) <* AS.endOfInput
+ src/ELynx/Sequence/Alignment.hs view
@@ -0,0 +1,323 @@+-- |+-- Module      :  ELynx.Sequence.Alignment+-- Description :  Multi sequence alignment related types and functions+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+--+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:40:18 2018.+--+-- This module is to be imported qualified.+module ELynx.Sequence.Alignment+  ( Alignment (..),+    length,+    nSequences,+    -- | * Input, output+    fromSequences,+    toSequences,+    summarize,+    -- | * Manipulation+    join,+    concat,+    concatAlignments,+    filterColsConstant,+    filterColsConstantSoft,+    filterColsOnlyStd,+    filterColsStd,+    filterColsNoGaps,+    -- | * Analysis+    FrequencyData,+    distribution,+    toFrequencyData,+    kEffEntropy,+    kEffHomoplasy,+    countIUPACChars,+    countGaps,+    countUnknowns,+    -- | * Sub sample+    subSample,+    randomSubSample,+  )+where++import Control.Monad hiding (join)+import Control.Monad.Primitive+import Control.Parallel.Strategies+import qualified Data.ByteString.Lazy.Char8 as BL+import Data.List hiding+  ( concat,+    length,+  )+import qualified Data.Matrix.Unboxed as M+import qualified Data.Vector.Unboxed as V+import qualified ELynx.Alphabet.Alphabet as A+import ELynx.Alphabet.Character+import qualified ELynx.Alphabet.DistributionDiversity as D+import ELynx.Sequence.Defaults+import qualified ELynx.Sequence.Sequence as S+import System.Random.MWC+import Prelude hiding+  ( concat,+    length,+  )++-- | A collection of sequences.+data Alignment = Alignment+  { names :: [S.Name],+    descriptions :: [S.Description],+    alphabet :: A.Alphabet,+    matrix :: M.Matrix Character+  }+  deriving (Show, Eq)++-- | Number of sites.+length :: Alignment -> Int+length = M.cols . matrix++-- | Number of sequences.+nSequences :: Alignment -> Int+nSequences = M.rows . matrix++-- | Create 'Alignment' from a list of 'S.Sequence's.+fromSequences :: [S.Sequence] -> Either String Alignment+fromSequences ss+  | S.equalLength ss && allEqual (map S.alphabet ss) =+    Right $+      Alignment ns ds a d+  | S.equalLength ss = Left "Sequences do not have equal codes."+  | otherwise = Left "Sequences do not have equal lengths."+  where+    ns = map S.name ss+    ds = map S.description ss+    a = S.alphabet $ head ss+    bss = map S.characters ss+    d = M.fromRows bss+    allEqual [] = True+    allEqual xs = all (== head xs) $ tail xs++-- | Conversion to list of 'S.Sequence's.+toSequences :: Alignment -> [S.Sequence]+toSequences (Alignment ns ds a da) =+  zipWith3+    (\n d r -> S.Sequence n d a r)+    ns+    ds+    rows+  where+    rows = M.toRows da++header :: Alignment -> BL.ByteString+header a =+  BL.unlines $+    [ BL.pack "Multi sequence alignment.",+      BL.pack $ "Code: " ++ A.alphabetDescription (alphabet a) ++ ".",+      BL.pack $ "Length: " ++ show (length a) ++ "."+    ]+      ++ reportLengthSummary+      ++ reportNumberSummary+  where+    reportLengthSummary =+      [ BL.pack $+          "For each sequence, the "+            ++ show summaryLength+            ++ " first bases are shown."+        | length a > summaryLength+      ]+    reportNumberSummary =+      [ BL.pack $+          show summaryNSequences+            ++ " out of "+            ++ show (nSequences a)+            ++ " sequences are shown."+        | nSequences a > summaryNSequences+      ]++-- | Similar to 'S.summarizeSequenceList' but with different Header.+summarize :: Alignment -> BL.ByteString+summarize a = header a <> S.body (toSequences a)++-- Vertical concatenation.+(===) :: V.Unbox a => M.Matrix a -> M.Matrix a -> M.Matrix a+(===) l r = M.fromRows $ lRs ++ rRs+  where+    lRs = M.toRows l+    rRs = M.toRows r++-- Horizontal concatenation.+(|||) :: V.Unbox a => M.Matrix a -> M.Matrix a -> M.Matrix a+(|||) l r = M.fromColumns $ lCs ++ rCs+  where+    lCs = M.toColumns l+    rCs = M.toColumns r++-- | Join two 'Alignment's vertically. That is, add more sequences+-- to an alignment. See also 'concat'.+join :: Alignment -> Alignment -> Alignment+-- top bottom.+join t b+  | length t /= length b =+    error+      "join: Multi sequence alignments do not have equal lengths."+  | alphabet t /= alphabet b =+    error+      "join: Multi sequence alignments do not have equal alphabets."+  | otherwise = Alignment ns ds al (tD === bD)+  where+    ns = names t ++ names b+    ds = descriptions t ++ descriptions b+    tD = matrix t+    bD = matrix b+    al = alphabet t++-- | Concatenate two 'Alignment's horizontally. That is, add more+-- sites to an alignment. See also 'join'.+concat :: Alignment -> Alignment -> Alignment+-- left right.+concat l r+  | nSequences l /= nSequences r =+    error+      "concat: Multi sequence alignments do not have an equal number of sequences."+  | alphabet l /= alphabet r =+    error "concat: Multi sequence alignments do not have an equal alphabets."+  | names l /= names r =+    error "concat: Multi sequence alignments do not have an equal names."+  | descriptions l /= descriptions r =+    error "concat: Multi sequence alignments do not have an equal descriptions."+  | otherwise =+    Alignment (names l) (descriptions l) (alphabet l) (lD ||| rD)+  where+    lD = matrix l+    rD = matrix r++-- | Concatenate a list of 'Alignment's horizontally. See+-- 'concat'.+concatAlignments :: [Alignment] -> Alignment+concatAlignments [] = error "concatAlignments: Nothing to concatenate."+concatAlignments [a] = a+concatAlignments as = foldl' concat (head as) (tail as)++-- Only keep columns from alignment that satisfy given predicate.+filterColsWith :: (V.Vector Character -> Bool) -> Alignment -> Alignment+filterColsWith p a = a {matrix = m'}+  where+    m' = M.fromColumns . filter p . M.toColumns $ matrix a++-- | Only keep constant columns.+filterColsConstant :: Alignment -> Alignment+filterColsConstant = filterColsWith (\v -> V.all (== V.head v) v)++-- | Only keep constant columns, and constant columns with at least one standard+-- character as well as any number of gaps or unknowns.+filterColsConstantSoft :: Alignment -> Alignment+filterColsConstantSoft a = filterColsWith f a+  where+    al = alphabet a+    f v = case V.find (A.isStd al) v of+      Nothing -> False+      Just c -> V.all (\x -> x == c || A.isGap al x || A.isUnknown al x) v++-- | Only keep columns with standard characters. Alignment columns with IUPAC+-- characters are removed.+filterColsOnlyStd :: Alignment -> Alignment+filterColsOnlyStd a = filterColsWith (V.all $ A.isStd (alphabet a)) a++-- | Filter columns with proportion of standard character larger than given number.+filterColsStd :: Double -> Alignment -> Alignment+filterColsStd prop a =+  filterColsWith+    (\col -> prop * n <= fromIntegral (V.length (V.filter (A.isStd al) col)))+    a+  where+    al = alphabet a+    n = fromIntegral $ nSequences a++-- | Only keep columns without gaps or unknown characters.+filterColsNoGaps :: Alignment -> Alignment+filterColsNoGaps a = filterColsWith (V.all $ not . A.isGap (alphabet a)) a++-- | Frequency data; do not store the actual characters, but their frequencies.+-- The matrix is of size @N x K@, where @N@ is the number of sites, and @K@ is+-- the number of characters.+type FrequencyData = M.Matrix Double++-- Map a function on each column of a DIM2 array; parallel version with given chunk size.+fMapColParChunk ::+  (V.Unbox a, V.Unbox b) =>+  Int ->+  (V.Vector a -> V.Vector b) ->+  M.Matrix a ->+  M.Matrix b+fMapColParChunk n f m =+  M.fromColumns (map f (M.toColumns m) `using` parListChunk n rseq)++-- | Calculcate frequency of characters at each site of a multi sequence alignment.+toFrequencyData :: Alignment -> FrequencyData+toFrequencyData a = fMapColParChunk 100 (D.frequencyCharacters spec) (matrix a)+  where+    spec = A.alphabetSpec (alphabet a)++-- | Calculate the distribution of characters.+distribution :: FrequencyData -> [Double]+distribution fd =+  map (/ fromIntegral nSites) $+    V.toList $+      foldl1+        (V.zipWith (+))+        (M.toColumns fd)+  where+    nSites = M.cols fd++-- Parallel map with given chunk size.+parMapChunk :: Int -> (a -> b) -> [a] -> [b]+parMapChunk n f as = map f as `using` parListChunk n rseq++chunksize :: Int+chunksize = 500++-- | Diversity analysis. See 'kEffEntropy'.+kEffEntropy :: FrequencyData -> [Double]+kEffEntropy fd = parMapChunk chunksize D.kEffEntropy (M.toColumns fd)++-- | Diversity analysis. See 'kEffEntropy'.+kEffHomoplasy :: FrequencyData -> [Double]+kEffHomoplasy fd = parMapChunk chunksize D.kEffHomoplasy (M.toColumns fd)++-- | Count the number of standard (i.e., not extended IUPAC) characters in the+-- alignment.+countIUPACChars :: Alignment -> Int+countIUPACChars a = V.length . V.filter (A.isIUPAC (alphabet a)) $ allChars+  where+    allChars = M.flatten $ matrix a++-- | Count the number of gaps in the alignment.+countGaps :: Alignment -> Int+countGaps a = V.length . V.filter (A.isGap (alphabet a)) $ allChars+  where+    allChars = M.flatten $ matrix a++-- | Count the number of unknown characters in the alignment.+countUnknowns :: Alignment -> Int+countUnknowns a = V.length . V.filter (A.isUnknown (alphabet a)) $ allChars+  where+    allChars = M.flatten $ matrix a++-- Sample the given sites from a matrix.+subSampleMatrix :: V.Unbox a => [Int] -> M.Matrix a -> M.Matrix a+subSampleMatrix is m =+  M.fromColumns $ foldl' (\a i -> M.takeColumn m i : a) [] (reverse is)++-- | Sample the given sites from a multi sequence alignment.+subSample :: [Int] -> Alignment -> Alignment+subSample is a = a {matrix = m'} where m' = subSampleMatrix is $ matrix a++-- | Randomly sample a given number of sites of the multi sequence alignment.+randomSubSample ::+  PrimMonad m => Int -> Alignment -> Gen (PrimState m) -> m Alignment+randomSubSample n a g = do+  let l = length a+  is <- replicateM n $ uniformR (0, l - 1) g+  return $ subSample is a
+ src/ELynx/Sequence/Defaults.hs view
@@ -0,0 +1,34 @@+-- |+-- Module      :  ELynx.Defaults+-- Description :  Various default values+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Oct  5 23:00:17 2018.+module ELynx.Sequence.Defaults+  ( nameWidth,+    summaryLength,+    summaryNSequences,+    fieldWidth,+  )+where++-- | Space reserved for sequence names when printing them.+nameWidth :: Int+nameWidth = 23++-- | The length shown when summarizing sequences.+summaryLength :: Int+summaryLength = 60++-- | How many sequences are shown in summary.+summaryNSequences :: Int+summaryNSequences = 200++-- | Field width for tables.+fieldWidth :: Int+fieldWidth = 13
+ src/ELynx/Sequence/Distance.hs view
@@ -0,0 +1,33 @@+-- |+-- Module      :  ELynx.Sequence.Distance+-- Description :  Distance functions between sequences+-- Copyright   :  (c) Dominik Schrempf, 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Aug 21 15:09:58 2020.+module ELynx.Sequence.Distance+  ( hamming,+  )+where++import qualified Data.Vector.Unboxed as V+import ELynx.Sequence.Sequence++countFalses :: (Int -> Bool -> Int)+countFalses n False = succ n+countFalses n True = n++-- | Compute hamming distance between two sequences.+hamming :: Sequence -> Sequence -> Either String Int+hamming l r+  | alphabet l /= alphabet r = Left "hamming: Alphabets of sequences differ."+  | V.length csL /= V.length csR = Left "hamming: Sequence lengths differ."+  | V.null csL || V.null csR = Left "hamming: Empty sequence encountered."+  | otherwise = Right $ V.foldl' countFalses 0 $ V.zipWith (==) (characters l) (characters r)+  where+    csL = characters l+    csR = characters r
+ src/ELynx/Sequence/Export/Fasta.hs view
@@ -0,0 +1,36 @@+-- |+-- Module      :  ELynx.Sequence.Export.Fasta+-- Description :  Export Fasta sequences+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Write FASTA files.+--+-- [NCBI file specifications](https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=BlastHelp).+module ELynx.Sequence.Export.Fasta+  ( sequenceToFasta,+    sequencesToFasta,+  )+where++import qualified Data.ByteString.Lazy.Char8 as BL+import ELynx.Sequence.Sequence++fastaHeader :: BL.ByteString -> BL.ByteString -> BL.ByteString+fastaHeader n d =+  BL.singleton '>' <> n <> if BL.null d then BL.empty else BL.pack " " <> d++-- | Convert a 'Sequence' to Fasta format.+sequenceToFasta :: Sequence -> BL.ByteString+sequenceToFasta s =+  BL.unlines [fastaHeader (name s) (description s), toByteString $ characters s]++-- | Convert a list 'Sequence's to Fasta format. A newline is added between any+-- two 'Sequence's.+sequencesToFasta :: [Sequence] -> BL.ByteString+sequencesToFasta ss = BL.concat $ map sequenceToFasta ss
+ src/ELynx/Sequence/Import/Fasta.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE BangPatterns #-}++-- |+-- Module      :  ELynx.Sequence.Import.Fasta+-- Description :  Import Fasta sequences+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Parse FASTA files.+--+-- [NCBI file specifications](https://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=BlastHelp).+module ELynx.Sequence.Import.Fasta+  ( fastaSequence,+    fasta,+  )+where++import Control.Applicative+import qualified Data.Attoparsec.ByteString as AS+import qualified Data.Attoparsec.ByteString.Char8 as AC+import qualified Data.ByteString.Lazy.Char8 as BL+import qualified Data.Set as S+import Data.Word8 (Word8)+import ELynx.Alphabet.Alphabet as A+import ELynx.Alphabet.Character+import ELynx.Sequence.Sequence++isSpecial :: Char -> Bool+isSpecial w = w `elem` ['_', '|', '.', '-']++isHeader :: Char -> Bool+isHeader w = AC.isAlpha_ascii w || AC.isDigit w || isSpecial w++sequenceHeader :: AS.Parser (BL.ByteString, BL.ByteString)+sequenceHeader = do+  _ <- AC.char '>'+  n <- AC.takeWhile1 isHeader+  _ <- AS.takeWhile AC.isHorizontalSpace+  d <- AC.takeWhile isHeader+  _ <- AC.endOfLine+  return (BL.fromStrict n, BL.fromStrict d)++-- It is a little faster to directly pass the set of allowed characters. Then,+-- this set only has to be calculcated once per sequence in 'fastaSequence'.+sequenceLine :: S.Set Word8 -> AS.Parser BL.ByteString+sequenceLine s = do+  -- XXX: Will fail for non-capital letters.+  !xs <- AS.takeWhile1 (`S.member` s)+  return (BL.fromStrict xs)++-- XXX: If sequences are parsed line by line, the lines have to be copied when+-- forming the complete sequence. This is not memory efficient.++-- | Parse a sequence of characters.+fastaSequence :: Alphabet -> AS.Parser Sequence+fastaSequence a = do+  (n, d) <- sequenceHeader+  let !alph = S.map toWord (A.all . alphabetSpec $ a)+  lns <- sequenceLine alph `AS.sepBy1` AC.endOfLine+  _ <- many AC.endOfLine+  return $ Sequence n d a (fromByteString $ BL.concat lns)++-- | Parse a Fasta file with given 'Alphabet'.+fasta :: Alphabet -> AS.Parser [Sequence]+fasta a = some (fastaSequence a) <* AS.endOfInput
+ src/ELynx/Sequence/Sequence.hs view
@@ -0,0 +1,244 @@+{-# LANGUAGE OverloadedStrings #-}++-- |+-- Module      :  ELynx.Sequence+-- Description :  Hereditary sequences+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Thu Oct  4 18:54:51 2018.+--+-- This module is to be imported qualified.+module ELynx.Sequence.Sequence+  ( -- * Types+    Name,+    Description,+    Characters,+    Sequence (..),++    -- * Input+    fromByteString,++    -- * Output+    toByteString,+    header,+    summarize,+    summarizeSequences,+    body,++    -- * Analysis+    length,+    equalLength,+    longest,++    -- * Manipulation+    trim,+    concat,+    concatSequences,++    -- * Filtering+    filterShorterThan,+    filterLongerThan,+    filterStandard,+  )+where++import Control.Parallel.Strategies+import qualified Data.ByteString.Lazy.Char8 as BL+import Data.List (maximumBy)+import Data.Ord (comparing)+import qualified Data.Vector.Unboxed as V+import qualified ELynx.Alphabet.Alphabet as A+import ELynx.Alphabet.Character+import ELynx.Sequence.Defaults+import qualified Text.Printf as P+import Prelude hiding+  ( concat,+    length,+  )+import qualified Prelude as Pr+  ( length,+  )++-- | For now, 'Name's are just 'BL.ByteString's.+type Name = BL.ByteString++-- | The description of a sequence.+type Description = BL.ByteString++-- | The vector of characters of a sequence.+type Characters = V.Vector Character++-- | Convert byte string to sequence characters.+fromByteString :: BL.ByteString -> Characters+fromByteString = V.fromList . map fromChar . BL.unpack++-- | Convert sequence characters to byte string.+toByteString :: Characters -> BL.ByteString+toByteString = BL.pack . map toChar . V.toList++-- | Sequences have a name, a possibly empty description, a code and hopefully a+-- lot of data.+data Sequence = Sequence+  { name :: Name,+    description :: Description,+    alphabet :: A.Alphabet,+    characters :: Characters+  }+  deriving (Show, Eq)++alignRight :: Int -> BL.ByteString -> BL.ByteString+alignRight n s =+  BL.replicate (fromIntegral n - l) ' ' <> BL.take (fromIntegral n) s+  where+    l = BL.length s++alignLeft :: Int -> BL.ByteString -> BL.ByteString+alignLeft n s =+  BL.take (fromIntegral n) s <> BL.replicate (fromIntegral n - l) ' '+  where+    l = BL.length s++getInfo :: Sequence -> BL.ByteString+getInfo s =+  BL.unwords+    [ alignLeft nameWidth (name s),+      alignRight fieldWidth (BL.pack $ show $ alphabet s),+      alignRight fieldWidth (BL.pack . show $ len),+      alignRight fieldWidth (BL.pack $ P.printf "%2.2f" pGaps)+    ]+  where+    len = length s+    nGaps = countGaps s+    pGaps = 100 * fromIntegral nGaps / fromIntegral len :: Double++-- If a string is longer than a given value, trim it and add some dots.+summarizeByteString :: Int -> BL.ByteString -> BL.ByteString+summarizeByteString l s+  | BL.length s >= fromIntegral l = BL.take (fromIntegral l) s <> BL.pack "..."+  | otherwise = s++-- | Trim and show a 'Sequence'.+summarize :: Sequence -> BL.ByteString+summarize s =+  BL.unwords+    [getInfo s, summarizeByteString summaryLength $ toByteString (characters s)]++-- | Trim and show a list of 'Sequence's.+summarizeSequences :: [Sequence] -> BL.ByteString+summarizeSequences ss = header ss <> body (take summaryNSequences ss)++-- | Header printed before 'Sequence' list.+tableHeader :: BL.ByteString+tableHeader =+  BL.unwords+    [ alignLeft nameWidth "Name",+      alignRight fieldWidth "Code",+      alignRight fieldWidth "Length",+      alignRight fieldWidth "Gaps [%]",+      "Sequence"+    ]++-- | A short description of the sequence.+header :: [Sequence] -> BL.ByteString+header ss =+  BL.unlines $+    reportIfSubsetIsShown+      ++ [ BL.pack $+             "For each sequence, the "+               ++ show summaryLength+               ++ " first bases are shown.",+           BL.pack $ "List contains " ++ show (Pr.length ss) ++ " sequences.",+           "",+           tableHeader+         ]+  where+    l = Pr.length ss+    s =+      show summaryNSequences+        ++ " out of "+        ++ show (Pr.length ss)+        ++ " sequences are shown."+    reportIfSubsetIsShown+      | l > summaryNSequences = [BL.pack s]+      | otherwise = []++-- | Trim and show a list of 'Sequence's.+body :: [Sequence] -> BL.ByteString+body ss = BL.unlines (map summarize ss `using` parListChunk 5 rdeepseq)++-- | Calculate length of 'Sequence'.+length :: Sequence -> Int+length = fromIntegral . V.length . characters++-- | Check if all 'Sequence's have equal length.+equalLength :: [Sequence] -> Bool+equalLength = allEqual . map length+  where+    allEqual [] = True+    allEqual xs = all (== head xs) $ tail xs++-- | Find the longest 'Sequence' in a list.+longest :: [Sequence] -> Sequence+longest = maximumBy (comparing length)++-- | Count number of gaps or unknown characters in sequence.+countGaps :: Sequence -> Int+countGaps s = V.length . V.filter (A.isGap $ alphabet s) $ characters s++-- | Trim to given length.+trim :: Int -> Sequence -> Sequence+trim n (Sequence nm d a cs) = Sequence nm d a (V.take (fromIntegral n) cs)++-- | Concatenate two sequences. 'Name's have to match.+concat :: Sequence -> Sequence -> Sequence+concat (Sequence i d c cs) (Sequence j f k ks)+  | i /= j =+    error $+      "concatenate: Sequences do not have equal names: "+        ++ BL.unpack i+        ++ ", "+        ++ BL.unpack j+        ++ "."+  | d /= f =+    error $+      "concatenate: Sequences do not have equal descriptions: "+        ++ BL.unpack d+        ++ ", "+        ++ BL.unpack f+        ++ "."+  | c /= k =+    error $+      "concatenate: Sequences do not have equal alphabets: "+        ++ show c+        ++ ", "+        ++ show k+        ++ "."+  | otherwise =+    Sequence i d c (cs <> ks)++-- | Concatenate a list of sequences, see 'concat'.+concatSequences :: [[Sequence]] -> [Sequence]+concatSequences [] = error "concatenateSequences: Nothing to concatenate."+concatSequences [ss] = ss+concatSequences sss = foldl1 (zipWith concat) sss++-- | Only take 'Sequence's that are shorter than a given number.+filterShorterThan :: Int -> [Sequence] -> [Sequence]+filterShorterThan n = filter (\x -> length x < n)++-- | Only take 'Sequence's that are longer than a given number.+filterLongerThan :: Int -> [Sequence] -> [Sequence]+filterLongerThan n = filter (\x -> length x > n)++-- | Only take 'Sequence's that contain at least on non-IUPAC character.+filterStandard :: [Sequence] -> [Sequence]+filterStandard = filter (\s -> anyStandard (alphabet s) s)++-- Are all characters IUPAC characters?+anyStandard :: A.Alphabet -> Sequence -> Bool+anyStandard a s = V.any (A.isStd a) cs where cs = characters s
+ src/ELynx/Sequence/Translate.hs view
@@ -0,0 +1,53 @@+-- |+-- Module      :  ELynx.Sequence.Translate+-- Description :  Translate sequences+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri May 17 13:49:18 2019.+module ELynx.Sequence.Translate+  ( translateSeq,+  )+where++import qualified Data.Vector.Unboxed as V+import ELynx.Alphabet.Alphabet+import qualified ELynx.Alphabet.Character as C+import ELynx.Character.Codon+import ELynx.Sequence.Sequence++-- Chop list into chunks of given length. If the last chop is shorter than+-- length, it is dropped.+chopVec :: V.Unbox a => Int -> V.Vector a -> [V.Vector a]+chopVec n xs+  | V.length xs < n = []+  | otherwise = V.take n xs : chopVec n (V.drop n xs)++-- | Translate a sequence from 'DNA' or 'DNAX' to 'ProteinS'.+translateSeq :: UniversalCode -> Int -> Sequence -> Sequence+translateSeq uc rf (Sequence n d a cs) = case a of+  DNA -> Sequence n d ProteinS (cs' $ translate uc)+  DNAX -> Sequence n d ProteinS (cs' $ translateX uc)+  DNAI -> Sequence n d ProteinI (cs' $ translateI uc)+  _ -> error "translate: can only translate DNA, DNAX, and DNAI."+  where+    cs' f = C.fromCVec $ translateVecWith f rf (C.toCVec cs)++-- Translate from DNA to Protein with given reading frame (0, 1, 2).+translateVecWith ::+  (V.Unbox a, Ord a, V.Unbox b) =>+  (Codon a -> b) ->+  Int ->+  V.Vector a ->+  V.Vector b+translateVecWith f rf cs+  | rf > 2 = error "translateVecWith: reading frame is larger than 2."+  | rf < 0 = error "translateVecWith: reading frame is negative."+  | otherwise = aas+  where+    codons = map fromVecUnsafe $ chopVec 3 $ V.drop rf cs+    aas = V.fromList $ map f codons
+ test/ELynx/Alphabet/DistributionDiversitySpec.hs view
@@ -0,0 +1,54 @@+-- |+-- Module      :  ELynx.Alphabet.DistributionDiversitySpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Mon Feb 25 13:41:12 2019.+module ELynx.Alphabet.DistributionDiversitySpec+  ( spec,+  )+where++import qualified Data.Vector.Unboxed as V+import ELynx.Alphabet.DistributionDiversity+import ELynx.Tools.Equality+import Test.Hspec++testArr1 :: V.Vector Double+testArr1 = V.replicate 20 0.0++testArr2 :: V.Vector Double+testArr2 = V.fromList [0, 0, 0, 1, 0]++-- Compare results from random array tested with Python functions.+testArr3 :: V.Vector Double+testArr3 = V.fromList [0.3, 0.4, 0.7]++spec :: Spec+spec = do+  describe "entropy" $+    it "calculates entropy of vectors" $ do+      entropy testArr1 `shouldBe` 0.0+      entropy testArr2 `shouldBe` 0.0+      entropy testArr3 `shouldSatisfy` nearlyEq 0.9773805948045555+  describe "kEffEntropy" $+    it "calculates the effective number of used states using entropy" $+      do+        kEffEntropy testArr1 `shouldBe` 1.0+        kEffEntropy testArr2 `shouldBe` 1.0+        kEffEntropy testArr3 `shouldSatisfy` nearlyEq 2.6574860842252765+  describe "homoplasy" $+    it "calculates homoplasy of vectors" $ do+      homoplasy testArr1 `shouldBe` 0.0+      homoplasy testArr2 `shouldBe` 1.0+      homoplasy testArr3 `shouldSatisfy` nearlyEq 0.74+  describe "kEffHomoplasy" $+    it "calculates the effective number of used states using homoplasy" $+      do+        kEffHomoplasy testArr1 `shouldSatisfy` isInfinite+        kEffHomoplasy testArr2 `shouldBe` 1.0+        kEffHomoplasy testArr3 `shouldSatisfy` nearlyEq 1.3513513513513513
− test/ELynx/Data/Alphabet/DistributionDiversitySpec.hs
@@ -1,54 +0,0 @@--- |--- Module      :  ELynx.Data.Alphabet.DistributionDiversitySpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Mon Feb 25 13:41:12 2019.-module ELynx.Data.Alphabet.DistributionDiversitySpec-  ( spec,-  )-where--import qualified Data.Vector.Unboxed as V-import ELynx.Data.Alphabet.DistributionDiversity-import ELynx.Tools.Equality-import Test.Hspec--testArr1 :: V.Vector Double-testArr1 = V.replicate 20 0.0--testArr2 :: V.Vector Double-testArr2 = V.fromList [0, 0, 0, 1, 0]---- Compare results from random array tested with Python functions.-testArr3 :: V.Vector Double-testArr3 = V.fromList [0.3, 0.4, 0.7]--spec :: Spec-spec = do-  describe "entropy" $-    it "calculates entropy of vectors" $ do-      entropy testArr1 `shouldBe` 0.0-      entropy testArr2 `shouldBe` 0.0-      entropy testArr3 `shouldSatisfy` nearlyEq 0.9773805948045555-  describe "kEffEntropy" $-    it "calculates the effective number of used states using entropy" $-      do-        kEffEntropy testArr1 `shouldBe` 1.0-        kEffEntropy testArr2 `shouldBe` 1.0-        kEffEntropy testArr3 `shouldSatisfy` nearlyEq 2.6574860842252765-  describe "homoplasy" $-    it "calculates homoplasy of vectors" $ do-      homoplasy testArr1 `shouldBe` 0.0-      homoplasy testArr2 `shouldBe` 1.0-      homoplasy testArr3 `shouldSatisfy` nearlyEq 0.74-  describe "kEffHomoplasy" $-    it "calculates the effective number of used states using homoplasy" $-      do-        kEffHomoplasy testArr1 `shouldSatisfy` isInfinite-        kEffHomoplasy testArr2 `shouldBe` 1.0-        kEffHomoplasy testArr3 `shouldSatisfy` nearlyEq 1.3513513513513513
− test/ELynx/Data/Sequence/AlignmentSpec.hs
@@ -1,47 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.AlignmentSpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Oct  5 14:25:42 2018.-module ELynx.Data.Sequence.AlignmentSpec-  ( spec,-  )-where--import qualified Data.ByteString.Lazy.Char8 as BL-import qualified Data.Matrix.Unboxed as M-import ELynx.Data.Alphabet.Alphabet-import ELynx.Data.Alphabet.Character-import ELynx.Data.Sequence.Alignment-import ELynx.Import.Sequence.Fasta-import ELynx.Tools.InputOutput-import Test.Hspec--fastaNucleotideIUPACFN :: FilePath-fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"--ssData :: M.Matrix Character-ssData = M.fromLists $ map (map fromChar) ["AAA", "GAA", "TAA"]--ssA :: Alignment-ssA =-  Alignment-    (map BL.pack ["SEQUENCE_1", "SEQUENCE_2", "SEQUENCE_3"])-    (replicate 3 BL.empty)-    DNAI-    ssData--spec :: Spec-spec = describe "subSample" $-  it "correctly sub sample an Alignment" $ do-    a <--      either error id-        . fromSequences-        <$> parseFileWith (fasta DNAI) fastaNucleotideIUPACFN-    let ss = subSample [0, 3, 5] a-    ss `shouldBe` ssA
− test/ELynx/Data/Sequence/SequenceSpec.hs
@@ -1,48 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.SequenceSpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Oct  5 14:25:42 2018.-module ELynx.Data.Sequence.SequenceSpec-  ( spec,-  )-where--import qualified Data.ByteString.Lazy.Char8 as BL-import ELynx.Data.Alphabet.Alphabet-import ELynx.Data.Sequence.Sequence-import ELynx.Import.Sequence.Fasta-import ELynx.Tools.InputOutput-import Test.Hspec--fastaDifferentLengthFN :: FilePath-fastaDifferentLengthFN = "data/NucleotideDifferentLength.fasta"--fastaDifferentLengthTrimmedFN :: FilePath-fastaDifferentLengthTrimmedFN = "data/NucleotideDifferentLengthTrimmed.fasta"--longestSequenceInFileBS :: BL.ByteString-longestSequenceInFileBS =-  BL.unlines $-    map BL.pack [">SEQUENCE_3", "ATTTAAAAAAACCCAAAACCCGGGCCCCGGGTTTTTTTA"]--longestSequenceInFile :: Sequence-longestSequenceInFile = parseByteStringWith (fastaSequence DNA) longestSequenceInFileBS--spec :: Spec-spec = do-  describe "longest" $-    it "finds the longest sequence" $ do-      ss <- parseFileWith (fasta DNA) fastaDifferentLengthFN-      longest ss `shouldBe` longestSequenceInFile-  describe "filterLongerThan" $-    it "filters sequences that are longer than a specified length" $-      do-        ss <- parseFileWith (fasta DNA) fastaDifferentLengthFN-        ss' <- parseFileWith (fasta DNA) fastaDifferentLengthTrimmedFN-        filterLongerThan 10 ss `shouldBe` ss'
− test/ELynx/Data/Sequence/TranslateSpec.hs
@@ -1,35 +0,0 @@--- |--- Module      :  ELynx.Data.Sequence.TranslateSpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Oct  5 14:25:42 2018.-module ELynx.Data.Sequence.TranslateSpec-  ( spec,-  )-where--import ELynx.Data.Alphabet.Alphabet-import ELynx.Data.Character.Codon-import ELynx.Data.Sequence.Translate-import ELynx.Import.Sequence.Fasta-import ELynx.Tools.InputOutput-import Test.Hspec--fastaTranslateDNAFN :: FilePath-fastaTranslateDNAFN = "data/TranslateMitochondrialVertebrateDNA.fasta"--fastaTranslateProteinFN :: FilePath-fastaTranslateProteinFN = "data/TranslateMitochondrialVertebrateProtein.fasta"--spec :: Spec-spec =-  describe "translateDNAX" $-    it "correctly translates a test sequence" $ do-      ss <- parseFileWith (fasta DNAX) fastaTranslateDNAFN-      ss' <- parseFileWith (fasta ProteinS) fastaTranslateProteinFN-      map (translateSeq VertebrateMitochondrial 0) ss `shouldBe` ss'
− test/ELynx/Export/Sequence/FastaSpec.hs
@@ -1,34 +0,0 @@--- |--- Module      :  ELynx.Export.Sequence.FastaSpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Jan 18 09:59:57 2019.-module ELynx.Export.Sequence.FastaSpec-  ( spec,-  )-where--import ELynx.Data.Alphabet.Alphabet-import ELynx.Export.Sequence.Fasta-import ELynx.Import.Sequence.Fasta-import ELynx.Tools.InputOutput-import Test.Hspec--fastaNucleotideIUPACFN :: FilePath-fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"--spec :: Spec-spec =-  describe "sequencesToFasta" $-    it-      "should create a fasta bytestring that, when parsed again, is the original sequence"-      $ do-        ss <- parseFileWith (fasta DNAI) fastaNucleotideIUPACFN-        let f = sequencesToFasta ss-            ss' = parseByteStringWith (fasta DNAI) f-        ss `shouldBe` ss'
− test/ELynx/Import/Sequence/FastaSpec.hs
@@ -1,64 +0,0 @@--- |--- Module      :  ELynx.Import.Sequence.FastaSpec--- Copyright   :  (c) Dominik Schrempf 2021--- License     :  GPL-3.0-or-later------ Maintainer  :  dominik.schrempf@gmail.com--- Stability   :  unstable--- Portability :  portable------ Creation date: Fri Jan 18 09:54:38 2019.-module ELynx.Import.Sequence.FastaSpec-  ( spec,-  )-where--import Data.Either-import ELynx.Data.Alphabet.Alphabet-import qualified ELynx.Data.Sequence.Alignment as M-import ELynx.Import.Sequence.Fasta-import ELynx.Tools.InputOutput-import Test.Hspec--fastaNucleotideFN :: FilePath-fastaNucleotideFN = "data/Nucleotide.fasta"--fastaNucleotideIUPACFN :: FilePath-fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"--fastaErroneousFN :: FilePath-fastaErroneousFN = "data/Erroneous.fasta"--fastaAminoAcidFN :: FilePath-fastaAminoAcidFN = "data/AminoAcid.fasta"--spec :: Spec-spec = describe "fastaFileAlignment" $ do-  it "parses a fasta file with nucleotide sequences with equal length" $ do-    a <--      either error id-        . M.fromSequences-        <$> parseFileWith (fasta DNA) fastaNucleotideFN-    M.nSequences a `shouldBe` 3-    M.length a `shouldBe` 40-  it "parses a fasta file with nucleotide IUPAC sequences with equal length" $-    do-      a <--        either error id-          . M.fromSequences-          <$> parseFileWith (fasta DNAI) fastaNucleotideIUPACFN-      M.nSequences a `shouldBe` 3-      M.length a `shouldBe` 40-  it "should not parse erroneous files" $ do-    ea <- runParserOnFile (fasta DNAI) fastaErroneousFN-    ea `shouldSatisfy` isLeft-  it "parses a fasta file with amino acid sequences with equal length" $ do-    a <--      either error id-        . M.fromSequences-        <$> parseFileWith (fasta Protein) fastaAminoAcidFN-    M.nSequences a `shouldBe` 2-    M.length a `shouldBe` 237-  it "should not parse erroneous files" $ do-    a <- runParserOnFile (fasta ProteinI) fastaErroneousFN-    a `shouldSatisfy` isLeft
+ test/ELynx/Sequence/AlignmentSpec.hs view
@@ -0,0 +1,47 @@+-- |+-- Module      :  ELynx.Sequence.AlignmentSpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Oct  5 14:25:42 2018.+module ELynx.Sequence.AlignmentSpec+  ( spec,+  )+where++import qualified Data.ByteString.Lazy.Char8 as BL+import qualified Data.Matrix.Unboxed as M+import ELynx.Alphabet.Alphabet+import ELynx.Alphabet.Character+import ELynx.Sequence.Alignment+import ELynx.Sequence.Import.Fasta+import ELynx.Tools.InputOutput+import Test.Hspec++fastaNucleotideIUPACFN :: FilePath+fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"++ssData :: M.Matrix Character+ssData = M.fromLists $ map (map fromChar) ["AAA", "GAA", "TAA"]++ssA :: Alignment+ssA =+  Alignment+    (map BL.pack ["SEQUENCE_1", "SEQUENCE_2", "SEQUENCE_3"])+    (replicate 3 BL.empty)+    DNAI+    ssData++spec :: Spec+spec = describe "subSample" $+  it "correctly sub sample an Alignment" $ do+    a <-+      either error id+        . fromSequences+        <$> parseFileWith (fasta DNAI) fastaNucleotideIUPACFN+    let ss = subSample [0, 3, 5] a+    ss `shouldBe` ssA
+ test/ELynx/Sequence/Export/FastaSpec.hs view
@@ -0,0 +1,34 @@+-- |+-- Module      :  ELynx.Sequence.Export.FastaSpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Jan 18 09:59:57 2019.+module ELynx.Sequence.Export.FastaSpec+  ( spec,+  )+where++import ELynx.Alphabet.Alphabet+import ELynx.Sequence.Export.Fasta+import ELynx.Sequence.Import.Fasta+import ELynx.Tools.InputOutput+import Test.Hspec++fastaNucleotideIUPACFN :: FilePath+fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"++spec :: Spec+spec =+  describe "sequencesToFasta" $+    it+      "should create a fasta bytestring that, when parsed again, is the original sequence"+      $ do+        ss <- parseFileWith (fasta DNAI) fastaNucleotideIUPACFN+        let f = sequencesToFasta ss+            ss' = parseByteStringWith (fasta DNAI) f+        ss `shouldBe` ss'
+ test/ELynx/Sequence/Import/FastaSpec.hs view
@@ -0,0 +1,64 @@+-- |+-- Module      :  ELynx.Sequence.Import.FastaSpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Jan 18 09:54:38 2019.+module ELynx.Sequence.Import.FastaSpec+  ( spec,+  )+where++import Data.Either+import ELynx.Alphabet.Alphabet+import qualified ELynx.Sequence.Alignment as M+import ELynx.Sequence.Import.Fasta+import ELynx.Tools.InputOutput+import Test.Hspec++fastaNucleotideFN :: FilePath+fastaNucleotideFN = "data/Nucleotide.fasta"++fastaNucleotideIUPACFN :: FilePath+fastaNucleotideIUPACFN = "data/NucleotideIUPAC.fasta"++fastaErroneousFN :: FilePath+fastaErroneousFN = "data/Erroneous.fasta"++fastaAminoAcidFN :: FilePath+fastaAminoAcidFN = "data/AminoAcid.fasta"++spec :: Spec+spec = describe "fastaFileAlignment" $ do+  it "parses a fasta file with nucleotide sequences with equal length" $ do+    a <-+      either error id+        . M.fromSequences+        <$> parseFileWith (fasta DNA) fastaNucleotideFN+    M.nSequences a `shouldBe` 3+    M.length a `shouldBe` 40+  it "parses a fasta file with nucleotide IUPAC sequences with equal length" $+    do+      a <-+        either error id+          . M.fromSequences+          <$> parseFileWith (fasta DNAI) fastaNucleotideIUPACFN+      M.nSequences a `shouldBe` 3+      M.length a `shouldBe` 40+  it "should not parse erroneous files" $ do+    ea <- runParserOnFile (fasta DNAI) fastaErroneousFN+    ea `shouldSatisfy` isLeft+  it "parses a fasta file with amino acid sequences with equal length" $ do+    a <-+      either error id+        . M.fromSequences+        <$> parseFileWith (fasta Protein) fastaAminoAcidFN+    M.nSequences a `shouldBe` 2+    M.length a `shouldBe` 237+  it "should not parse erroneous files" $ do+    a <- runParserOnFile (fasta ProteinI) fastaErroneousFN+    a `shouldSatisfy` isLeft
+ test/ELynx/Sequence/SequenceSpec.hs view
@@ -0,0 +1,48 @@+-- |+-- Module      :  ELynx.Sequence.SequenceSpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Oct  5 14:25:42 2018.+module ELynx.Sequence.SequenceSpec+  ( spec,+  )+where++import qualified Data.ByteString.Lazy.Char8 as BL+import ELynx.Alphabet.Alphabet+import ELynx.Sequence.Import.Fasta+import ELynx.Sequence.Sequence+import ELynx.Tools.InputOutput+import Test.Hspec++fastaDifferentLengthFN :: FilePath+fastaDifferentLengthFN = "data/NucleotideDifferentLength.fasta"++fastaDifferentLengthTrimmedFN :: FilePath+fastaDifferentLengthTrimmedFN = "data/NucleotideDifferentLengthTrimmed.fasta"++longestSequenceInFileBS :: BL.ByteString+longestSequenceInFileBS =+  BL.unlines $+    map BL.pack [">SEQUENCE_3", "ATTTAAAAAAACCCAAAACCCGGGCCCCGGGTTTTTTTA"]++longestSequenceInFile :: Sequence+longestSequenceInFile = parseByteStringWith (fastaSequence DNA) longestSequenceInFileBS++spec :: Spec+spec = do+  describe "longest" $+    it "finds the longest sequence" $ do+      ss <- parseFileWith (fasta DNA) fastaDifferentLengthFN+      longest ss `shouldBe` longestSequenceInFile+  describe "filterLongerThan" $+    it "filters sequences that are longer than a specified length" $+      do+        ss <- parseFileWith (fasta DNA) fastaDifferentLengthFN+        ss' <- parseFileWith (fasta DNA) fastaDifferentLengthTrimmedFN+        filterLongerThan 10 ss `shouldBe` ss'
+ test/ELynx/Sequence/TranslateSpec.hs view
@@ -0,0 +1,35 @@+-- |+-- Module      :  ELynx.Sequence.TranslateSpec+-- Copyright   :  (c) Dominik Schrempf 2021+-- License     :  GPL-3.0-or-later+--+-- Maintainer  :  dominik.schrempf@gmail.com+-- Stability   :  unstable+-- Portability :  portable+--+-- Creation date: Fri Oct  5 14:25:42 2018.+module ELynx.Sequence.TranslateSpec+  ( spec,+  )+where++import ELynx.Alphabet.Alphabet+import ELynx.Character.Codon+import ELynx.Sequence.Import.Fasta+import ELynx.Sequence.Translate+import ELynx.Tools.InputOutput+import Test.Hspec++fastaTranslateDNAFN :: FilePath+fastaTranslateDNAFN = "data/TranslateMitochondrialVertebrateDNA.fasta"++fastaTranslateProteinFN :: FilePath+fastaTranslateProteinFN = "data/TranslateMitochondrialVertebrateProtein.fasta"++spec :: Spec+spec =+  describe "translateDNAX" $+    it "correctly translates a test sequence" $ do+      ss <- parseFileWith (fasta DNAX) fastaTranslateDNAFN+      ss' <- parseFileWith (fasta ProteinS) fastaTranslateProteinFN+      map (translateSeq VertebrateMitochondrial 0) ss `shouldBe` ss'