module Bio.RNAplexParser (
parseRNAplex,
readRNAplex,
module Bio.RNAplexData
) where
import Bio.RNAplexData
import Bio.ViennaRNAParserLibrary
import Text.ParserCombinators.Parsec
import Text.Parsec.Numbers
import Control.Monad
parseRNAplexOutput :: GenParser Char st [RNAplexInteraction]
parseRNAplexOutput = do
rnaPlexInteractions <- many1 (try parseRNAplexInteraction)
eof
return $ rnaPlexInteractions
parseRNAplexInteraction :: GenParser Char st RNAplexInteraction
parseRNAplexInteraction = do
string (">")
_targetIdentifier <- many1 (noneOf "\n")
newline
string (">")
_queryIdentifier <- many1 (noneOf "\n")
newline
_secondaryStructure <- many1 (oneOf "&().,")
many1 space
_targetDuplexBegin <- parseIntegral
char ','
_targetDuplexEnd <- parseIntegral
many1 space
char ':'
many1 space
_queryDuplexBegin <- parseIntegral
char ','
_queryDuplexEnd <- parseIntegral
many1 space
char '('
optional (string " ")
_duplexEnergy <- parseFloat
optional (string " ")
optional (char '=')
optional (string " ")
_duplexEnergyWithoutAccessiblity <- optionMaybe (try parseFloat)
optional (string " ")
optional (char '+')
optional (many1 (string " "))
_queryAccessiblity <- optionMaybe (try parseFloat)
optional (string " ")
optional (char '+')
optional (many1 space)
_targetAccessibility <- optionMaybe (try parseFloat)
char ')'
many (oneOf " ")
optional (string "i:")
_prefilterStart <- optionMaybe (try parseIntegral)
optional (string ",")
optional (string "j:")
_prefilterEnd <- optionMaybe (try parseIntegral)
many (oneOf " ")
optional (string "<")
_prefilterEnergy <- optionMaybe (try parseFloat)
optional (string ">")
newline
return $ RNAplexInteraction _targetIdentifier _queryIdentifier _secondaryStructure _targetDuplexBegin _targetDuplexEnd _queryDuplexBegin _queryDuplexEnd _duplexEnergy _duplexEnergyWithoutAccessiblity _queryAccessiblity _targetAccessibility _prefilterStart _prefilterEnd _prefilterEnergy
parseRNAplex :: [Char] -> Either ParseError [RNAplexInteraction]
parseRNAplex input = parse parseRNAplexOutput "parseRNAplexOutput" input
readRNAplex :: String -> IO (Either ParseError [RNAplexInteraction])
readRNAplex filePath = parseFromFile parseRNAplexOutput filePath