module Biobase.Vienna.Import where
import Control.Arrow
import Data.Array.Repa.Index
import Data.Array.Repa.Shape
import qualified Data.ByteString.Char8 as BS
import qualified Data.Map as M
import Biobase.Primary
import Biobase.Secondary
import Biobase.Secondary.Vienna
import Data.PrimitiveArray
import qualified Biobase.Turner as T
import Biobase.Vienna
fromTurner2004 :: T.Turner2004 -> Vienna2004
fromTurner2004 turner = Vienna2004
{ stack = convert minPP maxPP $ T.stack turner
, dangle3 = convert minPB maxPB $ T.dangle3 turner
, dangle5 = convert minPB maxPB $ T.dangle5 turner
, hairpinL = convert (Z:.0) (Z:.30) $ T.hairpinL turner
, hairpinMM = convert minPBB maxPBB $ T.hairpinMM turner
, hairpinLookup = M.mapKeys (read . BS.unpack) . M.map deka $ T.hairpinLookup turner
, hairpinGGG = deka $ T.hairpinGGG turner
, hairpinCslope = deka $ T.hairpinCslope turner
, hairpinCintercept = deka $ T.hairpinCintercept turner
, hairpinC3 = deka $ T.hairpinC3 turner
, bulgeL = convert (Z:.0) (Z:.30) $ T.bulgeL turner
, bulgeSingleC = deka $ T.bulgeSingleC turner
, iloop1x1 = convert minPPBB maxPPBB $ T.iloop1x1 turner
, iloop2x1 = convert minPPBBB maxPPBBB $ T.iloop2x1 turner
, iloop2x2 = convert minPPBBBB maxPPBBBB $ T.iloop2x2 turner
, iloopMM = convert minPBB maxPBB $ T.iloopMM turner
, iloop2x3MM = convert minPBB maxPBB $ T.iloop2x3MM turner
, iloop1xnMM = convert minPBB maxPBB $ T.iloop1xnMM turner
, iloopL = convert (Z:.0) (Z:.30) $ T.iloopL turner
, multiMM = convert minPBB maxPBB $ T.multiMM turner
, ninio = deka $ T.ninio turner
, maxNinio = deka $ T.maxNinio turner
, multiOffset = deka $ T.multiOffset turner
, multiNuc = deka $ T.multiNuc turner
, multiHelix = deka $ T.multiHelix turner
, multiAsym = deka $ T.multiAsym turner
, multiStrain = deka $ T.multiStrain turner
, extMM = convert minPBB maxPBB $ T.extMM turner
, coaxial = convert minPP maxPP $ T.coaxial turner
, coaxStack = convert minPBB maxPBB $ T.coaxStack turner
, tStackCoax = convert minPBB maxPBB $ T.tStackCoax turner
, largeLoop = deka $ T.largeLoop turner
, termAU = deka $ T.termAU turner
, intermolecularInit = deka $ T.intermolecularInit turner
} where convert mn mx = fromAssocs mn mx 999999 . map (idxConvert *** deka) . assocs
class IdxConvert a b where
idxConvert :: a -> b
instance IdxConvert DIM1 DIM1 where
idxConvert = id
instance IdxConvert T.PNN PNN where
idxConvert (Z:.p1:.p2:.n1:.n2) = Z:. mkViennaPair (p1,p2) :.n1:.n2
instance IdxConvert T.PN PN where
idxConvert (Z:.p1:.p2:.n1) = Z:. mkViennaPair (p1,p2) :.n1
instance IdxConvert T.PPNNNN PPNNNN where
idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2:.n3:.n4) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2:.n3:.n4
instance IdxConvert T.PPNNN PPNNN where
idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2:.n3) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2:.n3
instance IdxConvert T.PPNN PPNN where
idxConvert (Z:.p11:.p12:.p21:.p22:.n1:.n2) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22) :.n1:.n2
instance IdxConvert T.PP PP where
idxConvert (Z:.p11:.p12:.p21:.p22) = Z:. mkViennaPair (p11,p12) :. mkViennaPair (p21,p22)
deka = round . (*100)
minP = Z:.vpNP
maxP = Z:.vpNS
minPB = minP:.nN
maxPB = maxP:.nU
minPP = minP:.vpNP
maxPP = maxP:.vpNS
minPBB = minP:.nN:.nN
maxPBB = maxP:.nU:.nU
minPPBB = minPP:.nN:.nN
maxPPBB = maxPP:.nU:.nU
minPPBBB = minPPBB:.nN
maxPPBBB = maxPPBB:.nU
minPPBBBB = minPPBBB:.nN
maxPPBBBB = maxPPBBB:.nU