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  }