module Biobase.Vienna.Import.Turner
( fromTurner
) where
import Control.Arrow
import Data.Tuple.All
import qualified Data.Map as M
import Biobase.Turner.Tables
import Biobase.Turner
import Data.PrimitiveArray
import Biobase.Constants
import Biobase.RNA
import Biobase.Vienna
fromTurner :: TurnerTables -> ViennaIntTables
fromTurner Turner2004{..} = Turner2004
{ stack = convert pp stack
, dangle3 = convert pb dangle3
, dangle5 = convert pb dangle5
, hairpinL = amap f2i hairpinL
, hairpinMM = convert pbb hairpinMM
, hairpinLookup = M.map f2i hairpinLookup
, bulgeL = amap f2i bulgeL
, iloop1x1 = convert uu iloop1x1
, iloop1x2 = convert uu iloop1x2
, iloop2x2 = convert uu iloop2x2
, iloopMM = convert pbb iloopMM
, iloop2x3MM = convert pbb iloop2x3MM
, iloop1xnMM = convert pbb iloop1xnMM
, iloopL = amap f2i iloopL
, multiMM = convert pbb multiMM
, ninio = f2i ninio
, maxNinio = f2i maxNinio
, multiOffset = f2i multiOffset
, multiNuc = f2i multiNuc
, multiHelix = f2i multiHelix
, extMM = convert pbb extMM
, largeLoop = largeLoop * 100
, termAU = f2i termAU
, intermolecularInit = f2i intermolecularInit
}
f2i :: Double -> Int
f2i d = round $ d * 100
pp = both tuple2Vienna
pb = first tuple2Vienna
pbb t = upd1 (tuple2Vienna $ sel1 t) t
uu t = upd2 (tuple2Vienna $ sel2 t) $ upd1 (tuple2Vienna $ sel1 t) t
both f = first f . second f
convert fk = fromAssocs minBound maxBound eInf . map (first fk . second f2i) . assocs