module Bio.Alignment.SAlign
(
local_score, local_align
, global_score, global_align
) where
import Data.List (maximumBy)
import Bio.Sequence.SeqData
import Bio.Alignment.AlignData
global_score :: (Num a, Ord a) => SubstMx t a -> a -> Sequence t -> Sequence t -> a
global_score mx g s1 s2 = last . last $ columns (g_score mx g) 0 s1 s2
g_score:: (Num a,Ord a) => SubstMx t a -> a -> Selector a
g_score mx g cds = maximum [s+eval mx g e | (s,e) <- cds]
local_score :: (Num a, Ord a) => SubstMx t a -> a -> Sequence t -> Sequence t -> a
local_score mx g s1 s2 = maximum . concat $ columns (l_score mx g) 0 s1 s2
l_score :: (Num a,Ord a) => SubstMx t a -> a -> Selector a
l_score mx g cds = maximum (0:[s+eval mx g e | (s,e) <- cds])
global_align :: (Num a, Ord a) => SubstMx t a -> a -> Sequence t -> Sequence t -> EditList
global_align mx g s1 s2 = reverse . snd . last . last
$ columns (g_align mx g) (0,[]) s1 s2
g_align :: (Num a, Ord a) => SubstMx t a -> a -> Selector (a,EditList)
g_align mx g cds = maximumBy (compare `on` fst) [(s+eval mx g e,e:a) | ((s,a),e) <- cds]
local_align :: (Num a, Ord a) => SubstMx t a -> a -> Sequence t -> Sequence t -> EditList
local_align mx g s1 s2 = reverse . snd . maximumBy (compare `on` fst) . concat
$ columns (l_align mx g) (0,[]) s1 s2
l_align :: (Num a, Ord a) => SubstMx t a -> a -> Selector (a,EditList)
l_align mx g cds = maximumBy (compare `on` fst) $ (0,[]):[(s+eval mx g e,e:a) | ((s,a),e) <- cds]