github.com/biogo/biogo@v1.0.4/alphabet/letters_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 alphabet 6 7 import ( 8 "fmt" 9 "math" 10 11 "gopkg.in/check.v1" 12 ) 13 14 type approxChecker struct { 15 *check.CheckerInfo 16 } 17 18 var approx check.Checker = &approxChecker{ 19 &check.CheckerInfo{Name: "Approx", Params: []string{"obtained", "expected", "epsilon"}}, 20 } 21 22 func (checker *approxChecker) Check(params []interface{}, names []string) (result bool, error string) { 23 defer func() { 24 if v := recover(); v != nil { 25 result = false 26 error = fmt.Sprint(v) 27 } 28 }() 29 return math.Abs(params[0].(float64)-params[1].(float64)) <= params[2].(float64)*params[1].(float64), "" 30 } 31 32 // Tests 33 func (s *S) TestPhred(c *check.C) { 34 // Confirm landmarks. 35 for _, t := range []struct { 36 E float64 37 Q Qphred 38 }{ 39 {E: 1e-1, Q: 10}, 40 {E: 1e-2, Q: 20}, 41 {E: 1e-3, Q: 30}, 42 {E: 1e-4, Q: 40}, 43 {E: 1e-5, Q: 50}, 44 } { 45 c.Check(Ephred(t.E), check.Equals, t.Q) 46 c.Check(t.Q.ProbE(), check.Equals, t.E) 47 } 48 for q := Qphred(0); q < 254; q++ { 49 c.Check(q.ProbE(), check.Equals, math.Pow(10, -(float64(q)/10))) 50 c.Check(Ephred(q.ProbE()), check.Equals, q) 51 } 52 c.Check(Qphred(254).ProbE(), check.Equals, 0.) 53 c.Check(math.IsNaN(Qphred(255).ProbE()), check.Equals, true) 54 } 55 56 func (s *S) TestSolexa(c *check.C) { 57 // Confirm landmarks. 58 for _, t := range []struct { 59 E float64 60 Q Qsolexa 61 }{ 62 {E: 1e-1 / (1 + 1e-1), Q: 10}, 63 {E: 1e-2 / (1 + 1e-2), Q: 20}, 64 {E: 1e-3 / (1 + 1e-3), Q: 30}, 65 {E: 1e-4 / (1 + 1e-4), Q: 40}, 66 {E: 1e-5 / (1 + 1e-5), Q: 50}, 67 } { 68 c.Check(Esolexa(t.E), check.Equals, t.Q) 69 c.Check(t.Q.ProbE(), approx, t.E, 1e-15) 70 } 71 c.Check(math.IsNaN(Qsolexa(-128).ProbE()), check.Equals, true) 72 for q := -127; q < 127; q++ { 73 pq := math.Pow(10, -(float64(q) / 10)) 74 pq /= (1 + pq) 75 c.Check(Qsolexa(q).ProbE(), check.Equals, pq) 76 c.Check(Esolexa(Qsolexa(q).ProbE()), check.Equals, Qsolexa(q)) 77 } 78 c.Check(Qsolexa(127).ProbE(), check.Equals, 0.) 79 } 80 81 func (s *S) TestInterconversion(c *check.C) { 82 for q := 0; q < 127; q++ { 83 if 10 <= q && q < 127 { 84 c.Check(Qphred(q).Qsolexa().Qphred(), check.Equals, Qphred(q)) 85 c.Check(Qsolexa(q).Qphred().Qsolexa(), check.Equals, Qsolexa(q)) 86 } 87 c.Check(Qphred(q).Qsolexa().ProbE(), approx, Qphred(q).ProbE(), math.Pow(10, 1e-4-float64(q)/10), 88 check.Commentf("Test %d at E = %e", q, Qphred(q).ProbE())) 89 c.Check(Qsolexa(q).Qphred().ProbE(), approx, Qsolexa(q).ProbE(), math.Pow(10, 1e-4-float64(q)/10), 90 check.Commentf("Test %d at E = %e", q, Qsolexa(q).ProbE())) 91 } 92 }