{-# LANGUAGE TypeOperators #-}

-- | The Vienna 2004 model is a mirror of the Turner data structure. The
-- difference is that The ViennaRNA package uses an explicit annotation for RNA
-- basepairs.
--
-- Furthermore, all energies are stored in parts of 1/100, using Ints instead
-- of Doubles.

module Biobase.Vienna where

import Data.Array.Repa.Index
import Data.Array.Repa.Shape
import Data.ByteString (ByteString)
import Data.Map (Map)

import Data.PrimitiveArray
import Data.PrimitiveArray.Unboxed.Zero
import Biobase.Primary
import Biobase.Secondary.Vienna

type P = Z:.ViennaPair
type PN = P:.Nuc
type PNN = PN:.Nuc
type PP = Z:.ViennaPair:.ViennaPair
type PPNN = PP:.Nuc:.Nuc
type PPNNN = PPNN:.Nuc
type PPNNNN = PPNNN:.Nuc

data Vienna2004 = Vienna2004
  { stack :: Arr0 PP Int
  , dangle3 :: Arr0 PN Int
  , dangle5 :: Arr0 PN Int
  , hairpinL :: Arr0 DIM1 Int
  , hairpinMM :: Arr0 PNN Int
  , hairpinLookup :: Map Primary Int
  , hairpinGGG :: Int
  , hairpinCslope :: Int
  , hairpinCintercept :: Int
  , hairpinC3 :: Int
  , bulgeL :: Arr0 DIM1 Int
  , bulgeSingleC :: Int
  , iloop1x1 :: Arr0 PPNN  Int
  , iloop2x1 :: Arr0 PPNNN Int
  , iloop2x2 :: Arr0 PPNNNN Int
  , iloopMM :: Arr0 PNN Int
  , iloop2x3MM :: Arr0 PNN Int
  , iloop1xnMM :: Arr0 PNN Int
  , iloopL :: Arr0 DIM1 Int
  , multiMM :: Arr0 PNN Int
  , ninio :: Int
  , maxNinio :: Int
  , multiOffset :: Int
  , multiNuc :: Int
  , multiHelix :: Int
  , multiAsym :: Int
  , multiStrain :: Int
  , extMM :: Arr0 PNN Int
  , coaxial :: Arr0 PP Int -- no intervening unpaired nucleotides
  , coaxStack :: Arr0 PNN Int
  , tStackCoax :: Arr0 PNN Int
  , largeLoop :: Int
  , termAU :: Int
  , intermolecularInit :: Int
  } -- deriving (Read,Show)