github.com/biogo/biogo@v1.0.4/align/pals/pals_test.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 pals
     6  
     7  import (
     8  	"github.com/biogo/biogo/align/pals/dp"
     9  	"github.com/biogo/biogo/align/pals/filter"
    10  	"github.com/biogo/biogo/alphabet"
    11  	"github.com/biogo/biogo/seq"
    12  	"github.com/biogo/biogo/seq/linear"
    13  	"github.com/biogo/biogo/util"
    14  
    15  	"bytes"
    16  	"fmt"
    17  	"math"
    18  	"testing"
    19  
    20  	"gopkg.in/check.v1"
    21  )
    22  
    23  const (
    24  	Q = 4
    25  )
    26  
    27  var (
    28  	maxk byte    = 8
    29  	l    [Q]byte = [Q]byte{'A', 'C', 'G', 'T'}
    30  	ps   *Packed
    31  )
    32  
    33  // Helpers
    34  type B struct {
    35  	*bytes.Buffer
    36  }
    37  
    38  func (b *B) Close() error { return nil }
    39  
    40  // Checkers
    41  type floatApproxChecker struct {
    42  	*check.CheckerInfo
    43  }
    44  
    45  var floatApprox check.Checker = &floatApproxChecker{
    46  	&check.CheckerInfo{Name: "Approximately", Params: []string{"obtained", "expected", "epsilon"}},
    47  }
    48  
    49  func (checker *floatApproxChecker) Check(params []interface{}, names []string) (result bool, error string) {
    50  	return math.Abs(params[0].(float64)-params[1].(float64))/params[0].(float64) < params[2].(float64), ""
    51  }
    52  
    53  // Tests
    54  func Test(t *testing.T) { check.TestingT(t) }
    55  
    56  type ft struct {
    57  	start, end int
    58  	result     *Feature
    59  }
    60  
    61  //	1:            deBruijn1          4            0-0
    62  //	2:            deBruijn2         16            1-1
    63  //	3:            deBruijn3         64            2-2
    64  //	4:            deBruijn4        256            3-3
    65  //	5:            deBruijn5       1024            4-5
    66  //	6:            deBruijn6       4096            6-10
    67  //	7:            deBruijn7      16384           11-27
    68  //	8:            deBruijn8      65536           28-92
    69  var T []ft = []ft{
    70  	{1020, 1030, &Feature{"deBruijn2", 0, 6, Contig("deBruijn2"), nil}},
    71  	{1025, 1030, &Feature{"deBruijn2", 1, 6, Contig("deBruijn2"), nil}},
    72  	{1010, 1060, &Feature{"deBruijn2", 0, 16, Contig("deBruijn2"), nil}},
    73  	{0, 1060, &Feature{"deBruijn1", 0, 4, Contig("deBruijn1"), nil}},
    74  	{4 * binSize, 4*binSize + 904, &Feature{"deBruijn5", 0, 904, Contig("deBruijn5"), nil}},
    75  	{29 * binSize, 32*binSize - 1, &Feature{"deBruijn8", 1024, 4095, Contig("deBruijn8"), nil}},
    76  }
    77  
    78  type pt struct {
    79  	l          int
    80  	id         float64
    81  	k, s, d, t int
    82  	list       float64
    83  }
    84  
    85  var P []pt = []pt{
    86  	{l: 50, id: 0.1, k: 6, s: 6, d: 0, t: 32, list: 7.3},
    87  	{l: 60, id: 0.1, k: 7, s: 7, d: 0, t: 32, list: 1.8},
    88  	{l: 70, id: 0.1, k: 8, s: 8, d: 0, t: 32, list: 0.46},
    89  	{l: 80, id: 0.1, k: 10, s: 10, d: 0, t: 32, list: 0.029},
    90  	{l: 90, id: 0.1, k: 11, s: 11, d: 0, t: 32, list: 0.0071},
    91  	{l: 100, id: 0.1, k: 6, s: 12, d: 1, t: 33, list: 7.3},
    92  	{l: 200, id: 0.5, k: 6, s: 25, d: 3, t: 35, list: 7.3},
    93  	{l: 200, id: 0.9, k: 10, s: 200, d: 19, t: 51, list: 0.029},
    94  	{l: 400, id: 0.8, k: 6, s: 50, d: 7, t: 39, list: 7.3},
    95  	{l: 400, id: 0.9, k: 10, s: 400, d: 39, t: 71, list: 0.029},
    96  	{l: 400, id: 0.99, k: 15, s: 400, d: 4, t: 36, list: 2.8e-05},
    97  }
    98  
    99  type S struct{}
   100  
   101  var _ = check.Suite(&S{})
   102  
   103  func (s *S) SetUpSuite(c *check.C) {
   104  	p := NewPacker("")
   105  	for k := byte(1); k <= maxk; k++ {
   106  		a := &linear.Seq{
   107  			Annotation: seq.Annotation{
   108  				ID: fmt.Sprintf("deBruijn%d", k),
   109  			},
   110  			Seq: make(alphabet.Letters, 0, util.Pow(Q, k)),
   111  		}
   112  		for _, i := range util.DeBruijn(byte(Q), k) {
   113  			a.Seq = append(a.Seq, alphabet.Letter(l[i]))
   114  		}
   115  		a.Loc = Contig(a.ID)
   116  		p.Pack(a)
   117  	}
   118  	ps = p.FinalisePack()
   119  }
   120  
   121  func (s *S) TestOptimise(c *check.C) {
   122  	// minHitLen int, minId float64, target, query *seq.Seq, tubeOffset int, maxMem uint64
   123  	t := &linear.Seq{Seq: make(alphabet.Letters, 29940)}
   124  	for _, p := range P {
   125  		pa := New(t, t, true, nil, 0, nil, nil)
   126  		err := pa.Optimise(p.l, p.id)
   127  		if err == nil {
   128  			c.Check(*pa.FilterParams, check.Equals, filter.Params{WordSize: p.k, MinMatch: p.s, MaxError: p.d, TubeOffset: p.t})
   129  			c.Check(*pa.DPParams, check.Equals, dp.Params{MinHitLength: p.l, MinId: p.id})
   130  			c.Check(pa.AvgIndexListLength(pa.FilterParams), floatApprox, p.list, 0.05)
   131  		}
   132  	}
   133  }
   134  
   135  func (s *S) TestPack(c *check.C) {
   136  	p := NewPacker("")
   137  	for k := byte(1); k <= maxk; k++ {
   138  		a := &linear.Seq{
   139  			Annotation: seq.Annotation{
   140  				ID: fmt.Sprintf("deBruijn%d", k),
   141  			},
   142  			Seq: make(alphabet.Letters, 0, util.Pow(Q, k)),
   143  		}
   144  		for _, i := range util.DeBruijn(byte(Q), k) {
   145  			a.Seq = append(a.Seq, alphabet.Letter(l[i]))
   146  		}
   147  		ps, _ := p.Pack(a)
   148  		c.Logf("%d: %s", k, ps)
   149  	}
   150  	c.Check(p.FinalisePack().Len(), check.Equals, 94208)
   151  }
   152  
   153  func (s *S) TestFeaturise(c *check.C) {
   154  	for _, t := range T {
   155  		f, err := ps.feature(t.start, t.end, false)
   156  		if err != nil {
   157  			c.Fatal(err)
   158  		}
   159  		c.Check(f, check.DeepEquals, t.result)
   160  	}
   161  }
   162  
   163  func (s *S) TestWrite(c *check.C) {
   164  	b := &B{&bytes.Buffer{}}
   165  	w := NewWriter(b, 4, 60, false)
   166  	for _, t := range T {
   167  		if f1, err := ps.feature(t.start, t.end, false); err != nil {
   168  			c.Fatal(err)
   169  		} else {
   170  			if f2, err := ps.feature(t.start, t.end, false); err != nil {
   171  				c.Fatal(err)
   172  			} else {
   173  				n, err := w.Write(&Pair{A: f1, B: f2})
   174  				c.Check(n, check.Not(check.Equals), 0)
   175  				c.Check(err, check.Equals, nil)
   176  			}
   177  		}
   178  	}
   179  	c.Check(string(b.Bytes()), check.Equals,
   180  		`deBruijn2	pals	hit	1	6	0.0000	.	.	Target deBruijn2 1 6; maxe 0
   181  deBruijn2	pals	hit	2	6	0.0000	.	.	Target deBruijn2 2 6; maxe 0
   182  deBruijn2	pals	hit	1	16	0.0000	.	.	Target deBruijn2 1 16; maxe 0
   183  deBruijn1	pals	hit	1	4	0.0000	.	.	Target deBruijn1 1 4; maxe 0
   184  deBruijn5	pals	hit	1	904	0.0000	.	.	Target deBruijn5 1 904; maxe 0
   185  deBruijn8	pals	hit	1025	4095	0.0000	.	.	Target deBruijn8 1025 4095; maxe 0
   186  `)
   187  }