mirror of
https://github.com/biopython/biopython.git
synced 2025-10-20 21:53:47 +08:00
Note the childs to children changes in Bio/Phylo/Consensus.py included fixing internal variable names only. Not applying all the catergories ==> categories fixes to the (deprecated) EMBOSS wrappers as some would be functional changes. Also no more LaTeX files (for spell checking)
129 lines
4.3 KiB
Python
129 lines
4.3 KiB
Python
# Copyright 2009 by Tiago Antao <tiagoantao@gmail.com>. All rights reserved.
|
|
# This code is part of the Biopython distribution and governed by its
|
|
# license. Please see the LICENSE file that should have been included
|
|
# as part of this package.
|
|
|
|
"""Tests for GenePop easy-controller."""
|
|
|
|
import os
|
|
import unittest
|
|
import warnings
|
|
|
|
from Bio import BiopythonDeprecationWarning
|
|
from Bio import MissingExternalDependencyError
|
|
|
|
with warnings.catch_warnings():
|
|
warnings.simplefilter("ignore", category=BiopythonDeprecationWarning)
|
|
from Bio.PopGen.GenePop.EasyController import EasyController
|
|
|
|
# Tests genepop related code for easy controller. Note: this requires genepop
|
|
# test_PopGen_GenePop_nodepend tests code that does not require genepop
|
|
|
|
found = False
|
|
for path in os.environ["PATH"].split(os.pathsep):
|
|
try:
|
|
for filename in os.listdir(path):
|
|
if filename.startswith("Genepop"):
|
|
found = True
|
|
except OSError:
|
|
pass # Path doesn't exist - correct to pass
|
|
if not found:
|
|
raise MissingExternalDependencyError(
|
|
"Install GenePop if you want to use Bio.PopGen.GenePop."
|
|
)
|
|
|
|
|
|
cur_dir = os.path.abspath(".") # Tests directory
|
|
|
|
|
|
class AppTest(unittest.TestCase):
|
|
"""Tests genepop execution via biopython using EasyController."""
|
|
|
|
def setUp(self):
|
|
"""Change working directory."""
|
|
# Genepop likes to be on the directory where the file is.
|
|
os.chdir("PopGen")
|
|
self.ctrl = EasyController("big.gen")
|
|
|
|
def tearDown(self):
|
|
"""Restore working directory."""
|
|
os.chdir(cur_dir)
|
|
|
|
def test_basic_info(self):
|
|
"""Test basic info."""
|
|
pops, loci = self.ctrl.get_basic_info()
|
|
self.assertEqual(len(pops), 10)
|
|
self.assertEqual(len(loci), 37)
|
|
|
|
def test_get_heterozygosity_info(self):
|
|
"""Test heterozygosity info."""
|
|
hz_info = self.ctrl.get_heterozygosity_info(0, "Locus2")
|
|
self.assertEqual(hz_info[1], 24)
|
|
self.assertEqual(hz_info[3], 7)
|
|
|
|
def test_get_alleles(self):
|
|
"""Test get alleles."""
|
|
# Returns keys of a dict, so order is Python implementation dependent
|
|
self.assertCountEqual(self.ctrl.get_alleles(0, "Locus3"), [3, 20])
|
|
|
|
def test_get_alleles_all_pops(self):
|
|
"""Test get alleles for all populations."""
|
|
self.assertEqual(self.ctrl.get_alleles_all_pops("Locus4"), [1, 3])
|
|
|
|
def test_get_fis(self):
|
|
"""Test get Fis."""
|
|
alleles, overall = self.ctrl.get_fis(0, "Locus2")
|
|
self.assertEqual(alleles[3][0], 55)
|
|
self.assertEqual(overall[0], 62)
|
|
|
|
def test_get_allele_frequency(self):
|
|
"""Test allele frequency."""
|
|
tot_genes, alleles = self.ctrl.get_allele_frequency(0, "Locus2")
|
|
self.assertEqual(tot_genes, 62)
|
|
self.assertLess(abs(alleles[20] - 0.113), 0.05)
|
|
|
|
def test_get_genotype_count(self):
|
|
"""Test genotype count."""
|
|
self.assertEqual(len(self.ctrl.get_genotype_count(0, "Locus2")), 3)
|
|
|
|
def test_estimate_nm(self):
|
|
"""Test Nm estimation."""
|
|
nms = self.ctrl.estimate_nm()
|
|
self.assertEqual(nms[0], 28.0)
|
|
|
|
def test_hwe_excess(self):
|
|
"""Test Hardy-Weinberg Equilibrium."""
|
|
hwe_excess = self.ctrl.test_hw_pop(0, "excess")
|
|
self.assertEqual(hwe_excess["Locus1"], (0.4955, None, -0.16, -0.1623, 5))
|
|
|
|
# These tests are frequently failing, possibly due to a Genepop problem.
|
|
# def test_get_avg_fst_pair_locus(self):
|
|
# """Test get average Fst for pairwise pops on a locus."""
|
|
# self.assertEqual(len(self.ctrl.get_avg_fst_pair_locus("Locus4")), 45)
|
|
#
|
|
# def test_get_avg_fst_pair(self):
|
|
# """Test get pairwise Fst."""
|
|
# pop_fis = self.ctrl.get_avg_fst_pair()
|
|
# self.assertEqual(len(pop_fis), 45)
|
|
|
|
def test_get_avg_fis(self):
|
|
"""Test average Fis."""
|
|
self.ctrl.get_avg_fis()
|
|
|
|
def test_get_multilocus_f_stats(self):
|
|
"""Test multilocus F stats."""
|
|
mf = self.ctrl.get_multilocus_f_stats()
|
|
self.assertEqual(len(mf), 3)
|
|
self.assertLess(mf[0], 0.1)
|
|
|
|
def test_get_f_stats(self):
|
|
"""Test F stats."""
|
|
fs = self.ctrl.get_f_stats("Locus2")
|
|
self.assertEqual(len(fs), 5)
|
|
self.assertLess(fs[0], 0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
runner = unittest.TextTestRunner(verbosity=2)
|
|
unittest.main(testRunner=runner)
|