BiobaseVienna-0.0.2.3: Biobase/Vienna/Modification/Partition.hs
-- | Small module for converting Vienna energy tables to partition function
-- value tables.
--
-- Temperature scaling should happen on the level of energy tables, followed by
-- conversion here.
--
-- TODO after the switch to the Energy type, change too, the partitionTables
-- generation
module Biobase.Vienna.Modification.Partition
( partitionTables
) where
import Biobase.Types.Partition
import Biobase.Types.Energy
import Biobase.Turner.Tables
import Biobase.Vienna
import Biobase.Constants
-- Testing
{-
import Biobase.Vienna.Default
import Data.PrimitiveArray
import Debug.Trace.Tools
import Biobase.RNA
import Biobase.Types.Ring
(g,h) = turner2004GH
-- x = toList $ stack $ partitionTables 37 g
x = {- toList $ -} (stack $ partitionTables 37 g) ! (vpGC,vpGC)
-}
-- | Create partition tables out of normal energy tables. Note that these
-- values are not normalized. An additional term 1/Z(1/kt) would be required
-- which is missing until we are done calculating the partition function.
--
-- All energy contributions are rescaled from dekacals back to kcal/mol.
--
-- We explicitly set all probabilities =0 where the energy is >= eMax.
partitionTables :: Temperature -> ViennaEnergyTables -> ViennaPartitionTables
partitionTables tempe trnr = dmap f trnr where
kt = (tempe + kelvinC0) * gasconst
-- convert energy into probability; encapsulate as a (logFloat) partition
f (Energy e') = {- traceVal (show (e',e,p)) -} p where
e = fromIntegral e' / 100
p = if e' >= eMax then Partition 0 else Partition . exp $ -e / kt -- can NOT use mkPartition as these values are NOT NORMALIZED