RNAwolf-0.3.0.0: BioInf/Params/Import.hs
-- | Given a list of doubles with the /exact required length/ import into a
-- 'Params' structure.
module BioInf.Params.Import where
import Data.PrimitiveArray as PA
import Data.PrimitiveArray.Ix as PA
import Data.Ix (rangeSize)
import BioInf.Params
-- | Cast a list of values to parameters.
--
-- NOTE This operation is rather fragile if there are layout changes. Consider
-- Repr for this.
--
-- NOTE BIG FAT WARNING: BE ABSOLUTELY SURE THAT ALL IMPORTS AND EXPORTS FOLLOW
-- THIS ORDERING EXACTLY, OTHERWISE KEYS WILL BE MAPPED TO WRONG POSITIONS
-- DURING LOOKUP AND VALUES END UP SOMEWHERE ELSE.
fromList :: [Double] -> Params
fromList xs = Params
{ hairpinLength = PA.fromList 0 maxLength hpl
, hairpinClose = PA.fromList minExtPairNN maxExtPairNN hpc
, stem = PA.fromList min2ExtPairs max2ExtPairs sp
, stemTriplet = PA.fromList minTriplet maxTriplet tp
, interiorLength = PA.fromList 0 maxLength il
, interiorAsym = PA.fromList 0 maxLength ia
, interiorClose = PA.fromList minExtPairNN maxExtPairNN ip
, bulgeLength = PA.fromList 0 maxLength bl
, bulgeTriplet = PA.fromList minTriplet maxTriplet bt
, bulgeClose = PA.fromList minExtPair maxExtPair bu
, mbClose = PA.fromList minExtPairNN maxExtPairNN mbc
, multiBranched = head mbranched
, multiHelix = head mhelix
, multiUnpaired = head munpaired
, pairDistance = PA.fromList 0 maxDistance dst
, interMolInit = head intermol
} where
rsExtPair = rangeSize (minExtPair,maxExtPair)
rs2ExtPairs = rangeSize (min2ExtPairs,max2ExtPairs)
rsTriplet = rangeSize (minTriplet,maxTriplet)
rsExtPairNN = rangeSize (minExtPairNN,maxExtPairNN)
[hpl,hpc,sp,tp,il,ia,ip,bl,bt,bu,mbc,mbranched,mhelix,munpaired,dst,intermol] = splitXs
[ maxLength+1 -- hairpin length
, rsExtPairNN -- hairpin close
, rs2ExtPairs -- stem pair
, rsTriplet -- triplet pair
, maxLength+1 -- interior loop length
, maxLength+1 -- interior loop asymmetry
, rsExtPairNN -- interior pair
, maxLength+1 -- bulge length
, rsTriplet -- bulge triplet
, rsExtPair -- normal bulge with non-overlapping nucs
, rsExtPairNN -- multibranch pair
, 1 -- multibranched score
, 1 -- helix in multibranch score
, 1 -- unpaired nucleotide score in multibranch
, maxDistance+1 -- pair long distance
, 1
]
xs
-- | split up a list accordings to given lengths
splitXs :: [Int] -> [Double] -> [[Double]]
splitXs [k] xs
| length xs == k = [xs]
| otherwise = error "splitXs encountered wrong key length on last element"
splitXs (k:ks) xs = let (here,rest) = splitAt k xs in here : splitXs ks rest