github.com/biogo/biogo@v1.0.4/align/fitted_affine.go (about) 1 // Copyright ©2011-2012 The bíogo Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package align 6 7 import ( 8 "github.com/biogo/biogo/alphabet" 9 "github.com/biogo/biogo/feat" 10 ) 11 12 // Setting debugFittedAffine to true gives verbose scoring table output for the dynamic programming. 13 const debugFittedAffine = false 14 15 // FittedAffine is the affine gap penalty fitted Needleman-Wunsch aligner type. 16 type FittedAffine Affine 17 18 // Align aligns two sequences using a modified Needleman-Wunsch algorithm that finds a local region of 19 // the reference with high similarity to the query. It returns an alignment description or an error if 20 // the scoring matrix is not square, or the sequence data types or alphabets do not match. 21 func (a FittedAffine) Align(reference, query AlphabetSlicer) ([]feat.Pair, error) { 22 alpha := reference.Alphabet() 23 if alpha == nil { 24 return nil, ErrNoAlphabet 25 } 26 if alpha != query.Alphabet() { 27 return nil, ErrMismatchedAlphabets 28 } 29 if alpha.IndexOf(alpha.Gap()) != 0 { 30 return nil, ErrNotGappedAlphabet 31 } 32 switch rSeq := reference.Slice().(type) { 33 case alphabet.Letters: 34 qSeq, ok := query.Slice().(alphabet.Letters) 35 if !ok { 36 return nil, ErrMismatchedTypes 37 } 38 return a.alignLetters(rSeq, qSeq, alpha) 39 case alphabet.QLetters: 40 qSeq, ok := query.Slice().(alphabet.QLetters) 41 if !ok { 42 return nil, ErrMismatchedTypes 43 } 44 return a.alignQLetters(rSeq, qSeq, alpha) 45 default: 46 return nil, ErrTypeNotHandled 47 } 48 }