module Biobase.Turner where
import Control.Lens
import Data.Array.Repa.Index
import Data.ByteString (ByteString(..))
import qualified Data.ByteString
import qualified Data.Map as M
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Generic as VG
import qualified Data.Vector.Generic.Mutable as VGM
import Data.Primitive.Types
import Biobase.Primary
import Biobase.Secondary
import Data.PrimitiveArray as PA
import Data.PrimitiveArray.Zero
newtype Energy = Energy Double
deriving (Eq,Ord,Num,Read,Show)
deriving instance Prim Energy
deriving instance VGM.MVector VU.MVector Energy
deriving instance VG.Vector VU.Vector Energy
deriving instance VU.Unbox Energy
type Turner2004 = Turner2004Model Energy
data Turner2004Model e = Turner2004Model
{ _stack :: !(Unboxed PP e)
, _dangle3 :: !(Unboxed PN e)
, _dangle5 :: !(Unboxed PN e)
, _hairpinL :: !(VU.Vector e)
, _hairpinMM :: !(Unboxed PNN e)
, _hairpinLookup :: !(M.Map Primary e)
, _hairpinGGG :: !e
, _hairpinCslope :: !e
, _hairpinCintercept :: !e
, _hairpinC3 :: !e
, _bulgeL :: !(VU.Vector e)
, _bulgeSingleC :: !e
, _iloop1x1 :: !(Unboxed PPNN e)
, _iloop2x1 :: !(Unboxed PPNNN e)
, _iloop2x2 :: !(Unboxed PPNNNN e)
, _iloopMM :: !(Unboxed PNN e)
, _iloop2x3MM :: !(Unboxed PNN e)
, _iloop1xnMM :: !(Unboxed PNN e)
, _iloopL :: !(VU.Vector e)
, _multiMM :: !(Unboxed PNN e)
, _ninio :: !e
, _maxNinio :: !e
, _multiOffset :: !e
, _multiNuc :: !e
, _multiHelix :: !e
, _multiAsym :: !e
, _multiStrain :: !e
, _extMM :: !(Unboxed PNN e)
, _coaxial :: !(Unboxed PP e)
, _coaxStack :: !(Unboxed PNN e)
, _tStackCoax :: !(Unboxed PNN e)
, _largeLoop :: !e
, _termAU :: !e
, _intermolecularInit :: !e
} deriving (Show)
type PP = (Z:.Nuc:.Nuc:.Nuc:.Nuc)
type PN = (Z:.Nuc:.Nuc:.Nuc)
type PNN = (Z:.Nuc:.Nuc:.Nuc:.Nuc)
type PPNN = PP:.Nuc:.Nuc
type PPNNN = PPNN:.Nuc
type PPNNNN = PPNNN:.Nuc
makeLenses ''Turner2004Model
emap :: (VU.Unbox e, VU.Unbox e') => (e -> e') -> Turner2004Model e -> Turner2004Model e'
emap f Turner2004Model{..} = Turner2004Model
{ _stack = PA.map f _stack
, _dangle3 = PA.map f _dangle3
, _dangle5 = PA.map f _dangle5
, _hairpinL = VU.map f _hairpinL
, _hairpinMM = PA.map f _hairpinMM
, _hairpinLookup = M.map f _hairpinLookup
, _hairpinGGG = f _hairpinGGG
, _hairpinCslope = f _hairpinCslope
, _hairpinCintercept = f _hairpinCintercept
, _hairpinC3 = f _hairpinC3
, _bulgeL = VU.map f _bulgeL
, _bulgeSingleC = f _bulgeSingleC
, _iloop1x1 = PA.map f _iloop1x1
, _iloop2x1 = PA.map f _iloop2x1
, _iloop2x2 = PA.map f _iloop2x2
, _iloopMM = PA.map f _iloopMM
, _iloop2x3MM = PA.map f _iloop2x3MM
, _iloop1xnMM = PA.map f _iloop1xnMM
, _iloopL = VU.map f _iloopL
, _multiMM = PA.map f _multiMM
, _ninio = f _ninio
, _maxNinio = f _maxNinio
, _multiOffset = f _multiOffset
, _multiNuc = f _multiNuc
, _multiHelix = f _multiHelix
, _multiAsym = f _multiAsym
, _multiStrain = f _multiStrain
, _extMM = PA.map f _extMM
, _coaxial = PA.map f _coaxial
, _coaxStack = PA.map f _coaxStack
, _tStackCoax = PA.map f _tStackCoax
, _largeLoop = f _largeLoop
, _termAU = f _termAU
, _intermolecularInit = f _intermolecularInit
}