BiobaseTurner 0.0.2.2 → 0.1.0.0
raw patch · 4 files changed
+269/−306 lines, 4 filesdep +BiobaseXNAdep +bytestringdep +bytestring-lexingdep −Biobasedep −HsToolsdep −ParsecToolsdep ~PrimitiveArraydep ~basedep ~splitPVP ok
version bump matches the API change (PVP)
Dependencies added: BiobaseXNA, bytestring, bytestring-lexing, filepath, iteratee
Dependencies removed: Biobase, HsTools, ParsecTools, filemanip, parsec, primitive
Dependency ranges changed: PrimitiveArray, base, split
API changes (from Hackage documentation)
- Biobase.Turner: type Basepair = (Nucleotide, Nucleotide)
- Biobase.Turner: type Temperature = Double
- Biobase.Turner: type TurnerEnthalpy = TurnerTables
- Biobase.Turner: type TurnerEntropy = TurnerTables
- Biobase.Turner: type TurnerSet = (Temperature, TurnerEntropy, TurnerEnthalpy)
- Biobase.Turner: type TurnerTables = Turner2004 Basepair Nucleotide Double
- Biobase.Turner.Import: parseTurner :: [Char] -> [Char] -> [Char] -> IO (Turner2004 (Nucleotide, Nucleotide) Nucleotide Double)
- Biobase.Turner.Tables: Turner2004 :: PrimArray (a, a) c -> PrimArray (a, b) c -> PrimArray (a, b) c -> PrimArray Int c -> PrimArray (a, b, b) c -> Map [b] c -> PrimArray Int c -> PrimArray (a, a, b, b) c -> PrimArray (a, a, b, b, b) c -> PrimArray (a, a, b, b, b, b) c -> PrimArray (a, b, b) c -> PrimArray (a, b, b) c -> PrimArray (a, b, b) c -> PrimArray Int c -> PrimArray (a, b, b) c -> c -> c -> c -> c -> c -> PrimArray (a, b, b) c -> Double -> c -> c -> Turner2004 a b c
- Biobase.Turner.Tables: bulgeL :: Turner2004 a b c -> PrimArray Int c
- Biobase.Turner.Tables: dangle3 :: Turner2004 a b c -> PrimArray (a, b) c
- Biobase.Turner.Tables: dangle5 :: Turner2004 a b c -> PrimArray (a, b) c
- Biobase.Turner.Tables: data Turner2004 a b c
- Biobase.Turner.Tables: extMM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: hairpinL :: Turner2004 a b c -> PrimArray Int c
- Biobase.Turner.Tables: hairpinLookup :: Turner2004 a b c -> Map [b] c
- Biobase.Turner.Tables: hairpinMM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: iloop1x1 :: Turner2004 a b c -> PrimArray (a, a, b, b) c
- Biobase.Turner.Tables: iloop1x2 :: Turner2004 a b c -> PrimArray (a, a, b, b, b) c
- Biobase.Turner.Tables: iloop1xnMM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: iloop2x2 :: Turner2004 a b c -> PrimArray (a, a, b, b, b, b) c
- Biobase.Turner.Tables: iloop2x3MM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: iloopL :: Turner2004 a b c -> PrimArray Int c
- Biobase.Turner.Tables: iloopMM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: intermolecularInit :: Turner2004 a b c -> c
- Biobase.Turner.Tables: largeLoop :: Turner2004 a b c -> Double
- Biobase.Turner.Tables: maxNinio :: Turner2004 a b c -> c
- Biobase.Turner.Tables: multiHelix :: Turner2004 a b c -> c
- Biobase.Turner.Tables: multiMM :: Turner2004 a b c -> PrimArray (a, b, b) c
- Biobase.Turner.Tables: multiNuc :: Turner2004 a b c -> c
- Biobase.Turner.Tables: multiOffset :: Turner2004 a b c -> c
- Biobase.Turner.Tables: ninio :: Turner2004 a b c -> c
- Biobase.Turner.Tables: stack :: Turner2004 a b c -> PrimArray (a, a) c
- Biobase.Turner.Tables: termAU :: Turner2004 a b c -> c
+ Biobase.Turner: Turner2004 :: PrimArray (Pair, Pair) Double -> PrimArray PN Double -> PrimArray PN Double -> PrimArray Int Double -> PrimArray PNN Double -> Map ByteString Double -> Double -> Double -> Double -> Double -> PrimArray Int Double -> Double -> PrimArray (Pair, Pair, (Nuc, Nuc)) Double -> PrimArray (Pair, Pair, (Nuc, Nuc, Nuc)) Double -> PrimArray (Pair, Pair, (Nuc, Nuc, Nuc, Nuc)) Double -> PrimArray PNN Double -> PrimArray PNN Double -> PrimArray PNN Double -> PrimArray Int Double -> PrimArray PNN Double -> Double -> Double -> Double -> Double -> Double -> Double -> Double -> PrimArray PNN Double -> PrimArray (Pair, Pair) Double -> PrimArray PNN Double -> PrimArray PNN Double -> Double -> Double -> Double -> Turner2004
+ Biobase.Turner: bulgeL :: Turner2004 -> PrimArray Int Double
+ Biobase.Turner: bulgeSingleC :: Turner2004 -> Double
+ Biobase.Turner: coaxStack :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: coaxial :: Turner2004 -> PrimArray (Pair, Pair) Double
+ Biobase.Turner: dangle3 :: Turner2004 -> PrimArray PN Double
+ Biobase.Turner: dangle5 :: Turner2004 -> PrimArray PN Double
+ Biobase.Turner: data Turner2004
+ Biobase.Turner: extMM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: hairpinC3 :: Turner2004 -> Double
+ Biobase.Turner: hairpinCintercept :: Turner2004 -> Double
+ Biobase.Turner: hairpinCslope :: Turner2004 -> Double
+ Biobase.Turner: hairpinGGG :: Turner2004 -> Double
+ Biobase.Turner: hairpinL :: Turner2004 -> PrimArray Int Double
+ Biobase.Turner: hairpinLookup :: Turner2004 -> Map ByteString Double
+ Biobase.Turner: hairpinMM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: iloop1x1 :: Turner2004 -> PrimArray (Pair, Pair, (Nuc, Nuc)) Double
+ Biobase.Turner: iloop1xnMM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: iloop2x1 :: Turner2004 -> PrimArray (Pair, Pair, (Nuc, Nuc, Nuc)) Double
+ Biobase.Turner: iloop2x2 :: Turner2004 -> PrimArray (Pair, Pair, (Nuc, Nuc, Nuc, Nuc)) Double
+ Biobase.Turner: iloop2x3MM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: iloopL :: Turner2004 -> PrimArray Int Double
+ Biobase.Turner: iloopMM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: instance Read Turner2004
+ Biobase.Turner: instance Show Turner2004
+ Biobase.Turner: intermolecularInit :: Turner2004 -> Double
+ Biobase.Turner: largeLoop :: Turner2004 -> Double
+ Biobase.Turner: maxNinio :: Turner2004 -> Double
+ Biobase.Turner: multiAsym :: Turner2004 -> Double
+ Biobase.Turner: multiHelix :: Turner2004 -> Double
+ Biobase.Turner: multiMM :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: multiNuc :: Turner2004 -> Double
+ Biobase.Turner: multiOffset :: Turner2004 -> Double
+ Biobase.Turner: multiStrain :: Turner2004 -> Double
+ Biobase.Turner: ninio :: Turner2004 -> Double
+ Biobase.Turner: stack :: Turner2004 -> PrimArray (Pair, Pair) Double
+ Biobase.Turner: tStackCoax :: Turner2004 -> PrimArray PNN Double
+ Biobase.Turner: termAU :: Turner2004 -> Double
+ Biobase.Turner: type PN = (Pair, Nuc)
+ Biobase.Turner: type PNN = (Pair, Nuc, Nuc)
+ Biobase.Turner.Import: blockFromFile :: FilePath -> IO [Double]
+ Biobase.Turner.Import: eneeBlocks :: (Functor m, Monad m) => Enumeratee ByteString [[Double]] m a
+ Biobase.Turner.Import: fromDir :: FilePath -> Prefix -> Suffix -> IO Turner2004
+ Biobase.Turner.Import: iMiscLoop :: (Functor m, Monad m) => Iteratee ByteString m [[Double]]
+ Biobase.Turner.Import: iTabulated :: (Functor m, Monad m) => Iteratee ByteString m [(ByteString, Double)]
+ Biobase.Turner.Import: miscFromFile :: FilePath -> IO [[Double]]
+ Biobase.Turner.Import: readD :: ByteString -> Double
+ Biobase.Turner.Import: tabFromFile :: FilePath -> IO [(ByteString, Double)]
+ Biobase.Turner.Import: type Prefix = FilePath
+ Biobase.Turner.Import: type Suffix = FilePath
+ Biobase.Turner.Import: values :: ByteString -> [Double]
Files
- Biobase/Turner.hs +58/−33
- Biobase/Turner/Import.hs +188/−121
- Biobase/Turner/Tables.hs +0/−133
- BiobaseTurner.cabal +23/−19
Biobase/Turner.hs view
@@ -1,41 +1,66 @@-{-# LANGUAGE TypeSynonymInstances #-} --- | Mathews / Turner nearest neighbor energy tables for interactions between--- RNA-RNA and DNA-DNA. Using lazy tables for easy filling of missing data.--- Transform tables into uvectors for efficient access.--module Biobase.Turner where--import Biobase.RNA (Nucleotide)-import qualified Biobase.Turner.Tables as T------ | Data structure containing all necessary tables for the Turner 2004 model.--- Note the temperature, using an additional function, rescaling becomes--- possible. A Show and a Read instance are automatically derived but one--- should use the Turner and/or Vienna import/export facilities. All data uses--- complete tables, where any base can pair with any other. Missing data ('.'--- in tables) is given by 'Nothing', otherwise we have 'Just Int'.--- +-- | The 'Turner2004' data structure reflects the RNA (and DNA) energy+-- parameters known as the Turner 2004 data set.+-- -- In general, have a look here:--- \url{http://rna.urmc.rochester.edu/NNDB/turner04/index.html} where--- parameters are explained.--- --- Conversion from Turner to Vienna is only possible in one direction as a--- number of parameters are not used in Vienna RNA Folding.+-- <http://rna.urmc.rochester.edu/NNDB/turner04/index.html> where parameters+-- are explained. +module Biobase.Turner where +import Data.ByteString+import Data.Map as M --- We are missing tables for DNA-RNA data: helixdr.dat, stackdr.dat,--- stackdr.dh. Several other files have unknown data, too. These are:--- dnadynalign*, fam\_hmm\_pars.dat, helix.dat, int22-exp.dh+import Biobase.Primary+import Biobase.Secondary+import Data.PrimitiveArray+import Data.PrimitiveArray.Ix -type TurnerTables = T.Turner2004 Basepair Nucleotide Double+-- | The parameters. Turner parameters are set by the Import module for+-- nucleotides n,a,c,g,u. All values that are not read (or are ".") will end up+-- with a value > 100K.+--+-- [1] Yes, such instances are easily created, but I don't want to pull in+-- another library and I don't want to create an Ix instance here.+--+-- TODO use 'Energy' instead of 'Double' -type TurnerEntropy = TurnerTables-type TurnerEnthalpy = TurnerTables-type Temperature = Double-type TurnerSet = (Temperature,TurnerEntropy,TurnerEnthalpy)+data Turner2004 = Turner2004+ { stack :: PrimArray (Pair,Pair) Double+ , dangle3 :: PrimArray PN Double+ , dangle5 :: PrimArray PN Double+ , hairpinL :: PrimArray Int Double+ , hairpinMM :: PrimArray PNN Double+ , hairpinLookup :: M.Map ByteString Double+ , hairpinGGG :: Double+ , hairpinCslope :: Double+ , hairpinCintercept :: Double+ , hairpinC3 :: Double+ , bulgeL :: PrimArray Int Double+ , bulgeSingleC :: Double+ , iloop1x1 :: PrimArray (Pair,Pair,(Nuc,Nuc)) Double+ , iloop2x1 :: PrimArray (Pair,Pair,(Nuc,Nuc,Nuc)) Double+ , iloop2x2 :: PrimArray (Pair,Pair,(Nuc,Nuc,Nuc,Nuc)) Double -- yeah, 6-tuple ix instances :-( [1]+ , iloopMM :: PrimArray PNN Double+ , iloop2x3MM :: PrimArray PNN Double+ , iloop1xnMM :: PrimArray PNN Double+ , iloopL :: PrimArray Int Double+ , multiMM :: PrimArray PNN Double+ , ninio :: Double+ , maxNinio :: Double+ , multiOffset :: Double+ , multiNuc :: Double+ , multiHelix :: Double+ , multiAsym :: Double+ , multiStrain :: Double+ , extMM :: PrimArray PNN Double+ , coaxial :: PrimArray (Pair,Pair) Double -- no intervening unpaired nucleotides+ , coaxStack :: PrimArray PNN Double+ , tStackCoax :: PrimArray PNN Double+ , largeLoop :: Double+ , termAU :: Double+ , intermolecularInit :: Double+ } deriving (Read,Show) -type Basepair = (Nucleotide,Nucleotide)+type PNN = (Pair,Nuc,Nuc)+type PN = (Pair,Nuc)
Biobase/Turner/Import.hs view
@@ -1,8 +1,8 @@ {-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE OverloadedStrings #-} --- | Turner file parser. Returns a Turner2004 data structure. We store data in--- the same way it is stored in the ViennaRNA package. Pairs are tuples--- however.+-- | Turner file parser. Returns a Turner2004 data structure. Requires an+-- annoying amount of boilerplate. -- -- How is 'stack' data stored: --@@ -32,145 +32,212 @@ -- --TODO not sure if dangle3/dangle5 are correctly split or if they should switch -module Biobase.Turner.Import- ( parseTurner- ) where+module Biobase.Turner.Import where -import Control.Applicative-import Control.Arrow (first)-import Control.Monad-import Data.Either-import Data.List.Split (splitEvery)-import Data.List (transpose)-import qualified Data.Map as M-import System.FilePath.Find-import Text.Parsec hiding ((<|>), many)-import Text.Parsec.String+import Control.Arrow+import Data.ByteString.Char8 as BS+import Data.ByteString.Lex.Double+import Data.Char+import Data.Iteratee as I+import Data.Iteratee.Char as I+import Data.Iteratee.IO as I+import Data.List.Split+import Data.Map as M+import qualified Data.List as L+import System.FilePath.Posix+import Data.Maybe (fromJust) -import Biobase.RNA-import Data.Ix.Tuple+import Biobase.Primary+import Biobase.Secondary import Data.PrimitiveArray-import Data.PrimitiveArray.Ix-import Text.Parsec.Numbers -import Biobase.Turner.Tables+import Biobase.Turner --- * Associate every file with a parse.+-- * -minp = (nucA,nucA)-maxp = (nucU,nucU)-minpb = (minp,nucA)-maxpb = (maxp,nucU)-minpp = (minp,minp)-maxpp = (maxp,maxp)-minppbb = (minp,minp,nucA,nucA)-maxppbb = (maxp,maxp,nucU,nucU)-minppbbb = (minp,minp,nucA,nucA,nucA)-maxppbbb = (maxp,maxp,nucU,nucU,nucU)-minppbbbb = (minp,minp,nucA,nucA,nucA,nucA)-maxppbbbb = (maxp,maxp,nucU,nucU,nucU,nucU)-minpbb = (minp,nucA,nucA)-maxpbb = (maxp,nucU,nucU)--- (4,3) switched for vienna rna compatibility-keyspp = [((k1,k2),(k4,k3)) | k1 <- acgu, k3 <- acgu, k2 <- acgu, k4 <- acgu]-keyspb = [((k1,k2),k3) | k1 <- acgu, k2 <- acgu, k3 <- acgu]-keyspbb = [((k1,k2),k3,k4) | k1 <- acgu, k3 <- acgu, k2 <- acgu, k4 <- acgu]-plist11 = [(nucA,nucU),(nucC,nucG),(nucG,nucC),(nucU,nucA),(nucG,nucU),(nucU,nucG)]-plist22 = [(nucA,nucU),(nucC,nucG),(nucG,nucC),(nucG,nucU),(nucU,nucA),(nucU,nucG)]--- (4,3) switched for vienna rna compatibility-keysppbb = [((k1,k2),(k4,k3),k5,k6) | (k1,k2) <- plist11, k5 <- acgu, (k3,k4) <- plist11, k6 <- acgu]--- (4,3) switched for vienna rna compatibility-keysppbbb = [((k1,k2),(k4,k3),k5,k6,k7) | (k1,k2) <- plist11, k6 <- acgu, k5 <- acgu, (k3,k4) <- plist11, k7 <- acgu]--- (4,3) switched for vienna rna compatibility, 5786 is 5'3' order top, bottom!-keysppbbbb = [((k1,k2),(k4,k3),k5,k6,k7,k8) | (k1,k2) <- plist22, (k3,k4) <- plist22, k5 <- acgu, k8 <- acgu, k6 <- acgu, k7 <- acgu]-z = 999999+-- | Given a directory, fill in the 'Turner2004' data structure +fromDir :: FilePath -> Prefix -> Suffix -> IO Turner2004+fromDir fp prefix suffix = do+ stack' <- blockFromFile $ fp </> prefix ++ "stack" <.> suffix+ dangle' <- blockFromFile $ fp </> prefix ++ "dangle" <.> suffix+ loop' <- blockFromFile $ fp </> prefix ++ "loop" <.> suffix+ hairpinMM' <- blockFromFile $ fp </> prefix ++ "tstackh" <.> suffix+ hairpinLk3 <- tabFromFile $ fp </> prefix ++ "triloop" <.> suffix+ hairpinLk4 <- tabFromFile $ fp </> prefix ++ "tloop" <.> suffix+ hairpinLk6 <- tabFromFile $ fp </> prefix ++ "hexaloop" <.> suffix+ let (dangle3',dangle5') = L.splitAt (L.length dangle' `div` 2) dangle'+ let (_:iloopL':bulgeL':hairpinL':[]) = L.transpose $ splitEvery 4 loop'+ iloop1x1' <- blockFromFile $ fp </> prefix ++ "int11" <.> suffix+ iloop2x1' <- blockFromFile $ fp </> prefix ++ "int21" <.> suffix+ iloop2x2' <- blockFromFile $ fp </> prefix ++ "int22" <.> suffix+ iloopMM' <- blockFromFile $ fp </> prefix ++ "tstacki" <.> suffix+ iloop2x3MM' <- blockFromFile $ fp </> prefix ++ "tstacki23" <.> suffix+ iloop1xnMM' <- blockFromFile $ fp </> prefix ++ "tstacki1n" <.> suffix+ multiMM' <- blockFromFile $ fp </> prefix ++ "tstacki" <.> suffix+ imisc' <- miscFromFile $ fp </> prefix ++ "miscloop" <.> suffix+ extMM' <- blockFromFile $ fp </> prefix ++ "tstack" <.> suffix+ coaxial' <- blockFromFile $ fp </> prefix ++ "coaxial" <.> suffix+ cstack' <- blockFromFile $ fp </> prefix ++ "coaxstack" <.> suffix+ tstack' <- blockFromFile $ fp </> prefix ++ "tstackcoax" <.> suffix+ return Turner2004+ { stack = fromAssocs minPP maxPP infE $ L.zip keysPP stack'+ , dangle3 = fromAssocs minPB maxPB infE $ L.zip keysPB dangle3'+ , dangle5 = fromAssocs minPB maxPB infE $ L.zip keysPB dangle5'+ , hairpinL = fromAssocs 0 30 infE $ L.zip [1..30] hairpinL'+ , hairpinMM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB hairpinMM'+ , hairpinLookup = M.fromList $ hairpinLk3 ++ hairpinLk4 ++ hairpinLk6+ , hairpinGGG = L.head $ imisc' !! 8+ , hairpinCslope = L.head $ imisc' !! 9+ , hairpinCintercept = L.head $ imisc' !! 10+ , hairpinC3 = L.head $ imisc' !! 11+ , bulgeL = fromAssocs 0 30 infE $ L.zip [1..30] bulgeL'+ , bulgeSingleC = L.head $ imisc' !! 13+ , iloop1x1 = fromAssocs minPPBB maxPPBB infE $ L.zip keysPPBB iloop1x1'+ , iloop2x1 = fromAssocs minPPBBB maxPPBBB infE $ L.zip keysPPBBB iloop2x1'+ , iloop2x2 = fromAssocs minPPBBBB maxPPBBBB infE $ L.zip keysPPBBBB iloop2x2'+ , iloopMM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB iloopMM'+ , iloop2x3MM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB iloop2x3MM'+ , iloop1xnMM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB iloop1xnMM'+ , iloopL = fromAssocs 0 30 infE $ L.zip [1..30] iloopL'+ , multiMM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB multiMM'+ , ninio = L.head $ imisc' !! 2+ , maxNinio = L.head $ imisc' !! 1+ , multiOffset = (imisc' !! 3) !! 0+ , multiNuc = (imisc' !! 3) !! 1+ , multiHelix = (imisc' !! 3) !! 2+ , multiAsym = L.head $ imisc' !! 5+ , multiStrain = L.head $ imisc' !! 6+ , extMM = fromAssocs minPBB maxPBB infE $ L.zip keysPBB extMM'+ , coaxial = fromAssocs minPP maxPP infE $ L.zip keysPP coaxial'+ , coaxStack = fromAssocs minPBB maxPBB infE $ L.zip keysPBB cstack'+ , tStackCoax = fromAssocs minPBB maxPBB infE $ L.zip keysPBB tstack'+ , largeLoop = L.head $ imisc' !! 0+ , termAU = L.head $ imisc' !! 7+ , intermolecularInit = L.head $ imisc' !! 12+ } +minPP = (minP,minP)+maxPP = (maxP,maxP)+minP = (nN,nN)+maxP = (nU,nU)+minPB = (minP,nN)+maxPB = (maxP,nU)+minPBB = (minP,nN,nN)+maxPBB = (maxP,nU,nU)+minPPBB = (minP,minP,(nN,nN))+maxPPBB = (maxP,maxP,(nU,nU))+minPPBBB = (minP,minP,(nN,nN,nN))+maxPPBBB = (maxP,maxP,(nU,nU,nU))+minPPBBBB = (minP,minP,(nN,nN,nN,nN))+maxPPBBBB = (maxP,maxP,(nU,nU,nU,nU)) --- | Given the base dir and a suffix (.dat/.dh most likely), parse the relevant--- files. The prefix can be used for, eg., dna file+keysPP = [((k1,k2),(k4,k3)) | k1 <- acgu, k3 <- acgu, k2 <- acgu, k4 <- acgu]+keysPB = [((k1,k2),k3) | k1 <- acgu, k2 <- acgu, k3 <- acgu]+keysPBB = [ ((k1,k2),k3,k4)+ | k1 <- acgu, k3 <- acgu, k2 <- acgu, k4 <- acgu]+keysPPBB = [ ((k1,k2),(k4,k3),(k5,k6))+ | (k1,k2) <- plist11, k5 <- acgu, (k3,k4) <- plist11, k6 <- acgu]+keysPPBBB = [ ((k1,k2),(k4,k3),(k5,k6,k7))+ | (k1,k2) <- plist11, k6 <- acgu, k5 <- acgu, (k3,k4) <- plist11, k7 <- acgu]+keysPPBBBB = [ ((k1,k2),(k4,k3),(k5,k6,k7,k8))+ | (k1,k2) <- plist22, (k3,k4) <- plist22, k5 <- acgu, k8 <- acgu, k6 <- acgu, k7 <- acgu] -parseTurner prefix basedir fsuffix = do- vstack <- grabB basedir fsuffix $ prefix ++ "stack"- vdangles <- grabB basedir fsuffix $ prefix ++ "dangle"- vlengths <- grabB basedir fsuffix $ prefix ++ "loop"- vhairmm <- grabB basedir fsuffix $ prefix ++ "tstackh"- viloopmm <- grabB basedir fsuffix $ prefix ++ "tstacki"- viloop23mm <- grabB basedir fsuffix $ prefix ++ "tstacki23"- viloop1nmm <- grabB basedir fsuffix $ prefix ++ "tstacki1n"- vmultimm <- grabB basedir fsuffix $ prefix ++ "tstackm"- vextmm <- grabB basedir fsuffix $ prefix ++ "tstack"- viloop11 <- grabB basedir fsuffix $ prefix ++ "int11"- viloop12 <- grabB basedir fsuffix $ prefix ++ "int21"- viloop22 <- grabB basedir fsuffix $ prefix ++ "int22"- vlookups <- fmap (map (first (map charToNucleotide)) . concat) $ mapM (\f -> grabA basedir fsuffix $ prefix ++ f) ["triloop","tloop","hexaloop"]- vmisc <- grabB basedir fsuffix $ prefix ++ "miscloop"- let (vdangle3,vdangle5) = splitAt (length vdangles `div` 2) vdangles- let (_:viloopl:vbulgel:vhairpinl:[]) = transpose $ splitEvery 4 vlengths- return $ Turner2004- { stack = fromAssocs minpp maxpp z $ zip keyspp vstack- , dangle3 = fromAssocs minpb maxpb z $ zip keyspb vdangle3- , dangle5 = fromAssocs minpb maxpb z $ zip keyspb vdangle5- , hairpinL = fromAssocs 0 30 z $ zip [1..] vhairpinl- , bulgeL = fromAssocs 0 30 z $ zip [1..] vbulgel- , iloopL = fromAssocs 0 30 z $ zip [1..] viloopl- , hairpinMM = fromAssocs minpbb maxpbb z $ zip keyspbb vhairmm- , iloopMM = fromAssocs minpbb maxpbb z $ zip keyspbb viloopmm- , iloop2x3MM = fromAssocs minpbb maxpbb z $ zip keyspbb viloop23mm- , iloop1xnMM = fromAssocs minpbb maxpbb z $ zip keyspbb viloop1nmm- , multiMM = fromAssocs minpbb maxpbb z $ zip keyspbb vmultimm- , extMM = fromAssocs minpbb maxpbb z $ zip keyspbb vextmm- , hairpinLookup = M.fromList vlookups- , iloop1x1 = fromAssocs minppbb maxppbb z $ zip keysppbb viloop11- , iloop1x2 = fromAssocs minppbbb maxppbbb z $ zip keysppbbb viloop12- , iloop2x2 = fromAssocs minppbbbb maxppbbbb z $ zip keysppbbbb viloop22- , ninio = vmisc !! 2- , maxNinio = vmisc !! 1- , multiOffset = vmisc !! 6- , multiNuc = vmisc !! 7- , multiHelix = vmisc !! 8- , largeLoop = vmisc !! 0- , termAU = vmisc !! 14- , intermolecularInit = vmisc !! 19- }+plist11 = [(nA,nU),(nC,nG),(nG,nC),(nU,nA),(nG,nU),(nU,nG)]+plist22 = [(nA,nU),(nC,nG),(nG,nC),(nG,nU),(nU,nA),(nU,nG)] -grabB basedir fsuffix fname = do- p <- parseFromFile pBlockFile (basedir ++ "/" ++ fname ++ fsuffix)- case p of- (Right ans) -> return ans- (Left err) -> error $ show err+infE = 999999 :: Double -grabA basedir fsuffix fname = do- p <- parseFromFile pAssocFile (basedir ++ "/" ++ fname ++ fsuffix)- case p of- (Right ans) -> return ans- (Left err) -> error $ show err+-- * Iteratee stuff +-- | Transform input stream into list of list of doubles +eneeBlocks :: (Functor m, Monad m) => Enumeratee ByteString [[Double]] m a+eneeBlocks = enumLinesBS ><> mapStream f ><> I.filter (not . L.null) where+ f x+ | "5'" `isPrefixOf` y = []+ | "3'" `isPrefixOf` y = []+ | "." `isPrefixOf` y = values y+ | Just (d,xs) <- readDouble y = values y+ | otherwise = [] -- error $ BS.unpack x+ where y = BS.dropWhile isSpace x --- * File parser: We do not want to understand the format, just extract all--- data.+-- | extract values. "." - values are extracted as > 100k --- | Blocks of data.+values :: ByteString -> [Double]+values xs+ | BS.null ys+ = []+ | "." `isPrefixOf` ys+ = infE : values (BS.drop 1 ys)+ | Just (d,zs) <- readDouble ys+ = d : values zs+ where ys = BS.dropWhile isSpace xs -pBlockFile = concat <$> many (try numberRow <|> infoRow) <* eof where- -- a line with a least one number- numberRow = many (char ' ') *> (number <* notFollowedBy (char '\'')) `sepEndBy1` (many $ char ' ') <* newline- -- a number is a dot or some extended floating point number- number = (try dotFloat) <|> (999999 <$ char '.') <|> parseExtFloat <?> "floating point number"+-- | Iteratee to parse tabulated loops (hairpins). --- | A File with associations.+iTabulated :: (Functor m, Monad m) => Iteratee ByteString m [(ByteString,Double)]+iTabulated = joinI $ enumLinesBS ><> I.filter (BS.all isSpace) $ g where+ g = do+ I.drop 2+ joinI $ mapStream f stream2stream+ f x+ | Just (d,_) <- readDouble v = (k,d)+ | otherwise = error $ "tabulated: <" ++ BS.unpack x ++ ">"+ where (k,v) = second (BS.dropWhile isSpace) . BS.span (not . isSpace) . BS.dropWhile isSpace $ x -pAssocFile = concat <$> many1 (try assocRow <|> infoRow) where- -- one assocs of string, value- assocRow = (\a b -> [(a,b)]) <$ many (char ' ') <*> many1 (oneOf nuc) <* many (char ' ') <*> parseExtFloat <* many (char ' ')+-- | Convenience function --- a line with crap-infoRow = [] <$ anyChar `manyTill` newline+blockFromFile :: FilePath -> IO [Double]+blockFromFile fp = do+ i <- enumFile 8192 fp . joinI $ eneeBlocks stream2list+ xs <- run i+ if (allEq $ L.map L.length xs)+ then return $ L.concat xs+ else error $ "in file: " ++ fp ++ " we have unequal line lengths" --- a rather stupid float-dotFloat = (\s a b -> read $ s:'0':a:b) <$> (char '-' <|> pure ' ') <*> char '.' <*> many1 digit+-- | Parses the miscloop table+--+-- NOTO extra brownie points for miscloop.dat for providing data in a form that+-- does not conform to normal number encoding. -nuc = "ACGUT"+iMiscLoop :: (Functor m, Monad m) => Iteratee ByteString m [[Double]]+iMiscLoop = joinI $ enumLinesBS ><> I.groupBy (\x y -> not $ BS.null y) $ f where+ f = do+ I.drop 1+ xs <- fmap (L.map (L.map (readD) . BS.words . L.last)) $ stream2list+ return xs++-- | Parses stupidly encoded values like ".6" and "-.0".++readD :: ByteString -> Double+readD xs+ | BS.null xs = error "readD: null"+ | BS.head xs == '.' = readD $ BS.cons '0' xs+ | "-." `BS.isPrefixOf` xs = readD $ "-0." `BS.append` BS.drop 2 xs+ | Just (d,_) <- readDouble xs = d+ | otherwise = error $ BS.unpack xs++-- |++miscFromFile :: FilePath -> IO [[Double]]+miscFromFile fp = run =<< enumFile 8192 fp iMiscLoop++-- | ++tabFromFile :: FilePath -> IO [(ByteString,Double)]+tabFromFile fp = run =<< enumFile 8192 fp iTabulated++allEq [] = True+allEq (x:xs) = L.all (==x) xs++{-+test1 = blockFromFile "/home/choener/Documents/Workdata/TurnerRNA2004/RNA/loop.dat"+test2 = fromDir "/home/choener/Documents/Workdata/TurnerRNA2004/RNA" "" ".dat"+-}++type Prefix = FilePath+type Suffix = FilePath+
− Biobase/Turner/Tables.hs
@@ -1,133 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE TypeSynonymInstances #-}---- | Turner Nearest Neighbor Energy Tables}---- TODO (Read) instance? (Vector has no Read instance...)--module Biobase.Turner.Tables where--import qualified Data.Map as M--import Data.PrimitiveArray-import Data.PrimitiveArray.Ix------ | A data structure describing all fields as used by the Turner 2004--- parameter set. Some fields are commented out until they are being used.--data Turner2004 a b c = Turner2004- { stack :: PrimArray (a,a) c- , dangle3 :: PrimArray (a,b) c- , dangle5 :: PrimArray (a,b) c- , hairpinL :: PrimArray Int c- , hairpinMM :: PrimArray (a,b,b) c- , hairpinLookup :: M.Map [b] c--- , hairpinGGG :: c--- , hairpinCslope :: c--- , hairpinCintercept :: c--- , hairpinC3 :: c- , bulgeL :: PrimArray Int c--- , bulgeSingleC :: c- , iloop1x1 :: PrimArray (a,a,b,b) c- , iloop1x2 :: PrimArray (a,a,b,b,b) c- , iloop2x2 :: PrimArray (a,a,b,b,b,b) c- , iloopMM :: PrimArray (a,b,b) c- , iloop2x3MM :: PrimArray (a,b,b) c- , iloop1xnMM :: PrimArray (a,b,b) c- , iloopL :: PrimArray Int c- , multiMM :: PrimArray (a,b,b) c- , ninio :: c- , maxNinio :: c- , multiOffset :: c- , multiNuc :: c- , multiHelix :: c--- , multiAsym :: c--- , multiStrain :: c- , extMM :: PrimArray (a,b,b) c--- , coaxStack :: PrimArray (a,a) c--- , coaxStackOpen :: PrimArray (a,b,b) c--- , coaxStackCont :: PrimArray (a,b,b) c- , largeLoop :: Double- , termAU :: c- , intermolecularInit :: c- }------ | Map functions over the payload.--dmap f Turner2004{..} = Turner2004- { stack = amap f stack- , dangle3 = amap f dangle3- , dangle5 = amap f dangle5- , hairpinL = amap f hairpinL- , hairpinMM = amap f hairpinMM- , hairpinLookup = fmap f hairpinLookup--- , hairpinGGG = f hairpinGGG--- , hairpinCslope = f hairpinCslope--- , hairpinCintercept = f hairpinCintercept--- , hairpinC3 = f hairpinC3- , bulgeL = amap f bulgeL--- , bulgeSingleC = f bulgeSingleC- , iloop1x1 = amap f iloop1x1- , iloop1x2 = amap f iloop1x2- , iloop2x2 = amap f iloop2x2- , iloopMM = amap f iloopMM- , iloop2x3MM = amap f iloop2x3MM- , iloop1xnMM = amap f iloop1xnMM- , iloopL = amap f iloopL- , multiMM = amap f multiMM- , ninio = f ninio- , maxNinio = f maxNinio- , multiOffset = f multiOffset- , multiNuc = f multiNuc- , multiHelix = f multiHelix--- , multiAsym = f multiAsym--- , multiStrain = f multiStrain- , extMM = amap f extMM--- , coaxStack = amap f coaxStack--- , coaxStackOpen = amap f coaxStackOpen--- , coaxStackCont = amap f coaxStackCont- , largeLoop = largeLoop- , termAU = f termAU- , intermolecularInit = f intermolecularInit- }------ | Zip two payloads.------ TODO right now, we have undefined behaviour when some arrrays are of different length--dZipWith f t1 t2 = Turner2004- { stack = zipWithPA f (stack t1) (stack t2)- , dangle3 = zipWithPA f (dangle3 t1) (dangle3 t2)- , dangle5 = zipWithPA f (dangle5 t1) (dangle5 t2)- , hairpinL = zipWithPA f (hairpinL t1) (hairpinL t2)- , hairpinMM = zipWithPA f (hairpinMM t1) (hairpinMM t2)- , hairpinLookup = undefined -- zipWithPA f (hairpinLookup t1) (hairpinLookup t2)- , bulgeL = zipWithPA f (bulgeL t1) (bulgeL t2)- , iloop1x1 = zipWithPA f (iloop1x1 t1) (iloop1x1 t2)- , iloop1x2 = zipWithPA f (iloop1x2 t1) (iloop1x2 t2)- , iloop2x2 = zipWithPA f (iloop2x2 t1) (iloop2x2 t2)- , iloopMM = zipWithPA f (iloopMM t1) (iloopMM t2)- , iloop2x3MM = zipWithPA f (iloop2x3MM t1) (iloop2x3MM t2)- , iloop1xnMM = zipWithPA f (iloop1xnMM t1) (iloop1xnMM t2)- , iloopL = zipWithPA f (iloopL t1) (iloopL t2)- , multiMM = zipWithPA f (multiMM t1) (multiMM t2)- , ninio = f (ninio t1) (ninio t2)- , maxNinio = f (maxNinio t1) (maxNinio t2)- , multiOffset = f (multiOffset t1) (multiOffset t2)- , multiNuc = f (multiNuc t1) (multiNuc t2)- , multiHelix = f (multiHelix t1) (multiHelix t2)- , extMM = zipWithPA f (extMM t1) (extMM t2)- , largeLoop = largeLoop t1 -- no zipping here! TODO make this a constant somewhere!- , termAU = f (termAU t1) (termAU t2)- , intermolecularInit = f (intermolecularInit t1) (intermolecularInit t2)- }--zipWithPA f a1 a2 = let (l,u) = bounds a1 in fromList l u $ zipWith f (toList a1) (toList a2)
BiobaseTurner.cabal view
@@ -1,39 +1,43 @@ name: BiobaseTurner-version: 0.0.2.2+version: 0.1.0.0 author: Christian Hoener zu Siederdissen maintainer: choener@tbi.univie.ac.at-copyright: Christian Hoener zu Siederdissen, 2010+homepage: http://www.tbi.univie.ac.at/~choener/+copyright: Christian Hoener zu Siederdissen, 2010,2011 category: Bioinformatics-synopsis: (deprecated) RNA folding data structures.+synopsis: Import Turner RNA parameters license: GPL-3 license-file: LICENSE build-type: Simple stability: experimental-cabal-version: >= 1.4.0+cabal-version: >= 1.6.0 description:- Data structures and parsers for the Turner 2004 set of RNA parameters.- - http://rna.urmc.rochester.edu/NNDB/index.html--+ A data structure for Mathews / Turner RNA and DNA energy+ parameters. This library currently only provides an importer,+ not export functions. There are two reasons: (i) We currently+ have no use-case where we need more than import facilities (ii)+ The file structure is geared towards humans, not machines. If+ you need to be able to export, send a mail.+ .+ This is the 2011 post-library split version, hence not+ deprecated anymore. library build-depends:- base >=4 && <5,+ base >3 && <5,+ bytestring,+ bytestring-lexing, containers,- parsec >=3 && <4,- primitive >=0.3 && <0.4,- filemanip >=0.3.3 && <0.4,- split >=0.1.2 && <0.2,-- Biobase >=0.0.2 && <0.0.3,- HsTools >=0.0.1.1 && <0.0.2,- ParsecTools >=0.0.2 && <0.0.3,- PrimitiveArray >=0.0.2 && <0.0.3+ filepath,+ iteratee,+ split,+ BiobaseXNA,+ PrimitiveArray exposed-modules: Biobase.Turner Biobase.Turner.Import- Biobase.Turner.Tables ghc-options: -O2+