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 }