|
1 | 1 | import pandas as pd |
2 | 2 | import pytest |
3 | 3 |
|
| 4 | +from bigtree.node.node import Node |
4 | 5 | from bigtree.tree.construct import dataframe_to_tree, dict_to_tree, nested_dict_to_tree |
5 | 6 | from bigtree.tree.export import ( |
6 | 7 | print_tree, |
@@ -1385,3 +1386,90 @@ def test_tree_to_newick(tree_node): |
1385 | 1386 | newick_str = tree_to_newick(tree_node) |
1386 | 1387 | expected_str = """((d,(g,h)e)b,(f)c)a""" |
1387 | 1388 | assert newick_str == expected_str |
| 1389 | + |
| 1390 | + @staticmethod |
| 1391 | + def test_tree_to_newick_length(tree_node): |
| 1392 | + newick_str = tree_to_newick(tree_node, length_attr="age") |
| 1393 | + expected_str = """((d:40,(g:10,h:6)e:35)b:65,(f:38)c:60)a""" |
| 1394 | + assert newick_str == expected_str |
| 1395 | + |
| 1396 | + @staticmethod |
| 1397 | + def test_tree_to_newick_length_invalid_error(tree_node): |
| 1398 | + with pytest.raises(ValueError) as exc_info: |
| 1399 | + tree_to_newick(tree_node, length_attr="age2") |
| 1400 | + assert str(exc_info.value).startswith( |
| 1401 | + "Length attribute does not exist for node " |
| 1402 | + ) |
| 1403 | + |
| 1404 | + @staticmethod |
| 1405 | + def test_tree_to_newick_length_sep(tree_node): |
| 1406 | + newick_str = tree_to_newick(tree_node, length_attr="age", length_sep=";") |
| 1407 | + expected_str = """((d;40,(g;10,h;6)e;35)b;65,(f;38)c;60)a""" |
| 1408 | + assert newick_str == expected_str |
| 1409 | + |
| 1410 | + @staticmethod |
| 1411 | + def test_tree_to_newick_attr_list(tree_node): |
| 1412 | + newick_str = tree_to_newick(tree_node, attr_list=["age"]) |
| 1413 | + expected_str = """((d[&&NHX:age=40],(g[&&NHX:age=10],h[&&NHX:age=6])e[&&NHX:age=35])b[&&NHX:age=65],(f[&&NHX:age=38])c[&&NHX:age=60])a[&&NHX:age=90]""" |
| 1414 | + assert newick_str == expected_str |
| 1415 | + |
| 1416 | + @staticmethod |
| 1417 | + def test_tree_to_newick_attr_list_invalid(tree_node): |
| 1418 | + newick_str = tree_to_newick(tree_node, attr_list=["age2"]) |
| 1419 | + expected_str = """((d,(g,h)e)b,(f)c)a""" |
| 1420 | + assert newick_str == expected_str |
| 1421 | + |
| 1422 | + @staticmethod |
| 1423 | + def test_tree_to_newick_attr_prefix(tree_node): |
| 1424 | + newick_str = tree_to_newick(tree_node, attr_list=["age"], attr_prefix="") |
| 1425 | + expected_str = """((d[age=40],(g[age=10],h[age=6])e[age=35])b[age=65],(f[age=38])c[age=60])a[age=90]""" |
| 1426 | + assert newick_str == expected_str |
| 1427 | + |
| 1428 | + @staticmethod |
| 1429 | + def test_tree_to_newick_intermediate_node_name(tree_node): |
| 1430 | + newick_str = tree_to_newick( |
| 1431 | + tree_node, intermediate_node_name=False, attr_list=["age"] |
| 1432 | + ) |
| 1433 | + expected_str = """((d[&&NHX:age=40],(g[&&NHX:age=10],h[&&NHX:age=6])[&&NHX:age=35])[&&NHX:age=65],(f[&&NHX:age=38])[&&NHX:age=60])[&&NHX:age=90]""" |
| 1434 | + assert newick_str == expected_str |
| 1435 | + |
| 1436 | + @staticmethod |
| 1437 | + def test_tree_to_newick_phylogenetic(): |
| 1438 | + """ |
| 1439 | + Example taken from: https://www.cs.mcgill.ca/~birch/doc/forester/NHX.pdf |
| 1440 | + """ |
| 1441 | + root = Node("placeholder_root", E="1.1.1.1", D="N") |
| 1442 | + metazoa = Node( |
| 1443 | + "placeholder_metazoa", |
| 1444 | + length=0.1, |
| 1445 | + S="Metazoa", |
| 1446 | + E="1.1.1.1", |
| 1447 | + D="N", |
| 1448 | + parent=root, |
| 1449 | + ) |
| 1450 | + primates = Node( |
| 1451 | + "placeholder_primates", |
| 1452 | + length=0.05, |
| 1453 | + S="Primates", |
| 1454 | + E="1.1.1.1", |
| 1455 | + D="Y", |
| 1456 | + B="100", |
| 1457 | + parent=metazoa, |
| 1458 | + ) |
| 1459 | + _ = Node("ADH2", length=0.1, S="human", E="1.1.1.1", parent=primates) |
| 1460 | + _ = Node("ADH1", length=0.11, S="human", E="1.1.1.1", parent=primates) |
| 1461 | + _ = Node("ADHY", length=0.1, S="nematode", E="1.1.1.1", parent=metazoa) |
| 1462 | + _ = Node("ADHX", length=0.12, S="insect", E="1.1.1.1", parent=metazoa) |
| 1463 | + fungi = Node("placeholder_fungi", length=0.1, S="Fungi", parent=root) |
| 1464 | + _ = Node("ADH4", length=0.09, S="yeast", E="1.1.1.1", parent=fungi) |
| 1465 | + _ = Node("ADH3", length=0.13, S="yeast", E="1.1.1.1", parent=fungi) |
| 1466 | + _ = Node("ADH2", length=0.12, S="yeast", E="1.1.1.1", parent=fungi) |
| 1467 | + _ = Node("ADH1", length=0.11, S="yeast", E="1.1.1.1", parent=fungi) |
| 1468 | + newick_str = tree_to_newick( |
| 1469 | + root, |
| 1470 | + intermediate_node_name=False, |
| 1471 | + length_attr="length", |
| 1472 | + attr_list=["S", "E", "D", "B"], |
| 1473 | + ) |
| 1474 | + expected_str = """(((ADH2:0.1[&&NHX:S=human:E=1.1.1.1],ADH1:0.11[&&NHX:S=human:E=1.1.1.1]):0.05[&&NHX:S=Primates:E=1.1.1.1:D=Y:B=100],ADHY:0.1[&&NHX:S=nematode:E=1.1.1.1],ADHX:0.12[&&NHX:S=insect:E=1.1.1.1]):0.1[&&NHX:S=Metazoa:E=1.1.1.1:D=N],(ADH4:0.09[&&NHX:S=yeast:E=1.1.1.1],ADH3:0.13[&&NHX:S=yeast:E=1.1.1.1],ADH2:0.12[&&NHX:S=yeast:E=1.1.1.1],ADH1:0.11[&&NHX:S=yeast:E=1.1.1.1]):0.1[&&NHX:S=Fungi])[&&NHX:E=1.1.1.1:D=N]""" |
| 1475 | + assert newick_str == expected_str |
0 commit comments