Package: phytest
Phytest: Quality Control for Phylogenetic Analyses.Documentation:https://phytest-devs.github.io/phytestCode:https://github.com/phytest-devs/phytestTutorials:https://github.com/phytest-devs?q=exampleInstallationInstall phytest using pip:pipinstallphytestQuick StartPhytest is a tool for automating quality control checks on sequence, tree and metadata files during phylogenetic analyses.
Phytest ensures that phylogenetic analyses meet user-defined quality control tests.Here we will create example data files to run our tests on.Create an alignment fasta fileexample.fasta>Sequence_A
ATGAGATCCCCGATAGCGAGCTAGCGATCGCAGCGACTCAGCAGCTACAGCGCAGAGGAGAGAGAGGCCCCTATTTACTAGAGCTCCAGATATAGNNTAG
>Sequence_B
ATGAGATCCCCGATAGCGAGCTAGXGATCGCAGCGACTCAGCAGCTACAGCGCAGAGGAGAGAGAGGCCCCTATTTACTAGAGCTCCAGATATAGNNTAG
>Sequence_C
ATGAGA--CCCGATAGCGAGCTAGCGATCGCAGCGACTCAGCAGCTACAGCGCAGAGGAGAGAGAGGCCCCTATTTACTAGAGCTCCAGATATAGNNTAG
>Sequence_D
ATGAGATCCCCGATAGCGAGCTAGCGATNNNNNNNNNNNNNNNNNTACAGCGCAGAGGAGAGAGAGGCCCCTATTTACTAGAGCTCCAGATATAGNNTAGCreate a tree newick fileexample.tree(Sequence_A:1,Sequence_B:0.2,(Sequence_C:0.3,Sequence_D:0.4):0.5);Writing a test fileWe want to enforce the follow constraints on our data:The alignment has 4 sequencesThe sequences have a length of 100The sequences only contains the characters A, T, G, C, N and -The sequences are allowed to only contain single base deletionsThe longest stretch of Ns is 10The tree has 4 tipsThe tree is bifurcatingThe alignment and tree have the same namesAll internal branches are longer than the given thresholdThere are no outlier branches in the treeWe can write these tests in a python filesexample.pyfromphytestimportAlignment,Sequence,Treedeftest_alignment_has_4_sequences(alignment:Alignment):alignment.assert_length(4)deftest_alignment_has_a_width_of_100(alignment:Alignment):alignment.assert_width(100)deftest_sequences_only_contains_the_characters(sequence:Sequence):sequence.assert_valid_alphabet(alphabet="ATGCN-")deftest_single_base_deletions(sequence:Sequence):sequence.assert_longest_stretch_gaps(max=1)deftest_longest_stretch_of_Ns_is_10(sequence:Sequence):sequence.assert_longest_stretch_Ns(max=10)deftest_tree_has_4_tips(tree:Tree):tree.assert_number_of_tips(4)deftest_tree_is_bifurcating(tree:Tree):tree.assert_is_bifurcating()deftest_aln_tree_match_names(alignment:Alignment,tree:Tree):aln_names=[i.nameforiinalignment]tree.assert_tip_names(aln_names)deftest_all_internal_branches_lengths_above_threshold(tree:Tree,threshold=1e-4):tree.assert_internal_branch_lengths(min=threshold)deftest_outlier_branches(tree:Tree):# Here we create a custom function to detect outliersimportstatisticstips=tree.get_terminals()branch_lengths=[t.branch_lengthfortintips]cut_off=statistics.mean(branch_lengths)+statistics.stdev(branch_lengths)fortipintips:asserttip.branch_length<cut_off,f"Outlier tip '{tip.name}' (branch length ={tip.branch_length})!"Running PhytestWe can then run these tests on our data withphytest:phytestexamples/example.py-sexamples/data/example.fasta-texamples/data/example.treeGenerate a report by adding--report report.html.From the output we can see several tests failed:FAILED examples/example.py::test_sequences_only_contains_the_characters[Sequence_B] - AssertionError: Invalid pattern found in 'Sequence_B'!
FAILED examples/example.py::test_single_base_deletions[Sequence_C] - AssertionError: Longest stretch of '-' in 'Sequence_C' > 1!
FAILED examples/example.py::test_longest_stretch_of_Ns_is_10[Sequence_D] - AssertionError: Longest stretch of 'N' in 'Sequence_D' > 10!
FAILED examples/example.py::test_outlier_branches - AssertionError: Outlier tip 'Sequence_A' (branch length = 1.0)!

Results (0.07s):
    15 passed
    4 failed
        - examples/example.py:12 test_sequences_only_contains_the_characters[Sequence_B]
        - examples/example.py:16 test_single_base_deletions[Sequence_C]
        - examples/example.py:20 test_longest_stretch_of_Ns_is_10[Sequence_D]
        - examples/example.py:32 test_outlier_branchesSee docs for more informationhttps://phytest-devs.github.io/phytest.CitationIf you use phytest, please cite the following paper:Wytamma Wirth, Simon Mutch, Robert Turnbull, Sebastian Duchene, Phytest: quality control for phylogenetic analyses, Bioinformatics, Volume 38, Issue 22, 15 November 2022, Pages 5124–5125,https://doi.org/10.1093/bioinformatics/btac664@article{10.1093/bioinformatics/btac664,author={Wirth, Wytamma and Mutch, Simon and Turnbull, Robert and Duchene, Sebastian},title="{{Phytest: quality control for phylogenetic analyses}}",journal={Bioinformatics},volume={38},number={22},pages={5124-5125},year={2022},month={10},issn={1367-4803},doi={10.1093/bioinformatics/btac664},url={https://doi.org/10.1093/bioinformatics/btac664},eprint={https://academic.oup.com/bioinformatics/article-pdf/38/22/5124/47153886/btac664.pdf},}