module ELynx.Import.MarkovProcess.SiteprofilesPhylobayes
( siteprofiles,
)
where
import Control.Applicative
import Control.Monad
import qualified Data.Attoparsec.ByteString as AS
import qualified Data.Attoparsec.ByteString.Char8 as AC
import Data.Containers.ListUtils (nubInt)
import qualified Data.Vector.Storable as V
import ELynx.Import.MarkovProcess.EDMModelPhylobayes
siteprofiles :: AS.Parser [EDMComponent]
siteprofiles = (AS.<?> "phylobayes siteprofiles") $ do
_ <- headerLines
cs <- many dataLine
_ <- AC.skipWhile AC.isSpace
_ <- AS.endOfInput
let ls = map length cs
nLs = length $ nubInt ls
when
(nLs /= 1)
(error "The site profiles have a different number of entries.")
return cs
line :: AS.Parser ()
line = AS.skipWhile (not . AC.isEndOfLine)
headerLines :: AS.Parser ()
headerLines = line *> AC.skipWhile AC.isSpace AS.<?> "headerLine"
dataLine :: AS.Parser EDMComponent
dataLine = (AS.<?> "dataLine") $ do
_ <- AC.decimal :: AS.Parser Int
_ <- AS.skipWhile AC.isHorizontalSpace
vals <- AC.double `AS.sepBy1` AS.skipWhile AC.isHorizontalSpace
_ <- AC.skipWhile AC.isSpace
return (1.0, V.fromList vals)