phykit 2.1.47__tar.gz → 2.1.49__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. {phykit-2.1.47 → phykit-2.1.49}/PKG-INFO +18 -2
  2. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/plot_config.py +3 -0
  3. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/quartet_utils.py +5 -4
  4. {phykit-2.1.47 → phykit-2.1.49}/phykit/phykit.py +116 -30
  5. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/ancestral_reconstruction.py +6 -0
  6. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/concordance_asr.py +3 -0
  7. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/cont_map.py +3 -0
  8. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/cophylo.py +4 -0
  9. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/density_map.py +3 -0
  10. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/discordance_asymmetry.py +2 -0
  11. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylo_heatmap.py +3 -0
  12. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/quartet_pie.py +6 -2
  13. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/rate_heterogeneity.py +3 -0
  14. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/stochastic_character_map.py +3 -0
  15. phykit-2.1.49/phykit/version.py +1 -0
  16. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/PKG-INFO +18 -2
  17. phykit-2.1.47/phykit/version.py +0 -1
  18. {phykit-2.1.47 → phykit-2.1.49}/LICENSE.md +0 -0
  19. {phykit-2.1.47 → phykit-2.1.49}/README.md +0 -0
  20. {phykit-2.1.47 → phykit-2.1.49}/phykit/__init__.py +0 -0
  21. {phykit-2.1.47 → phykit-2.1.49}/phykit/__main__.py +0 -0
  22. {phykit-2.1.47 → phykit-2.1.49}/phykit/cli_registry.py +0 -0
  23. {phykit-2.1.47 → phykit-2.1.49}/phykit/errors.py +0 -0
  24. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/__init__.py +0 -0
  25. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/boolean_argument_parsing.py +0 -0
  26. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/caching.py +0 -0
  27. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/discrete_models.py +0 -0
  28. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/files.py +0 -0
  29. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/json_output.py +0 -0
  30. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/parallel.py +0 -0
  31. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/stats_summary.py +0 -0
  32. {phykit-2.1.47 → phykit-2.1.49}/phykit/helpers/streaming.py +0 -0
  33. {phykit-2.1.47 → phykit-2.1.49}/phykit/service_factories.py +0 -0
  34. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/__init__.py +0 -0
  35. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/__init__.py +0 -0
  36. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/alignment_entropy.py +0 -0
  37. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/alignment_length.py +0 -0
  38. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/alignment_length_no_gaps.py +0 -0
  39. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/alignment_outlier_taxa.py +0 -0
  40. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/alignment_recoding.py +0 -0
  41. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/base.py +0 -0
  42. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/column_score.py +0 -0
  43. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/composition_per_taxon.py +0 -0
  44. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/compositional_bias_per_site.py +0 -0
  45. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/create_concatenation_matrix.py +0 -0
  46. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/dna_threader.py +0 -0
  47. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/evolutionary_rate_per_site.py +0 -0
  48. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/faidx.py +0 -0
  49. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/gc_content.py +0 -0
  50. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/mask_alignment.py +0 -0
  51. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/occupancy_per_taxon.py +0 -0
  52. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/pairwise_identity.py +0 -0
  53. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/parsimony_informative_sites.py +0 -0
  54. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/plot_alignment_qc.py +0 -0
  55. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/rcv.py +0 -0
  56. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/rcvt.py +0 -0
  57. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/rename_fasta_entries.py +0 -0
  58. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/sum_of_pairs_score.py +0 -0
  59. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/alignment/variable_sites.py +0 -0
  60. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/base.py +0 -0
  61. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/__init__.py +0 -0
  62. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/base.py +0 -0
  63. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/bipartition_support_stats.py +0 -0
  64. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/branch_length_multiplier.py +0 -0
  65. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/collapse_branches.py +0 -0
  66. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/consensus_network.py +0 -0
  67. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/consensus_tree.py +0 -0
  68. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/covarying_evolutionary_rates.py +0 -0
  69. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/dvmc.py +0 -0
  70. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/evo_tempo_map.py +0 -0
  71. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/evolutionary_rate.py +0 -0
  72. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/fit_continuous.py +0 -0
  73. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/fit_discrete.py +0 -0
  74. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/hidden_paralogy_check.py +0 -0
  75. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/independent_contrasts.py +0 -0
  76. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/internal_branch_stats.py +0 -0
  77. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/internode_labeler.py +0 -0
  78. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/kf_distance.py +0 -0
  79. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/last_common_ancestor_subtree.py +0 -0
  80. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/lb_score.py +0 -0
  81. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/ltt.py +0 -0
  82. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/monophyly_check.py +0 -0
  83. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/nearest_neighbor_interchange.py +0 -0
  84. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/network_signal.py +0 -0
  85. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/ou_shift_detection.py +0 -0
  86. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/ouwie.py +0 -0
  87. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/parsimony_score.py +0 -0
  88. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/patristic_distances.py +0 -0
  89. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phenogram.py +0 -0
  90. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylogenetic_glm.py +0 -0
  91. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylogenetic_ordination.py +0 -0
  92. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylogenetic_regression.py +0 -0
  93. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylogenetic_signal.py +0 -0
  94. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/phylomorphospace.py +0 -0
  95. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/polytomy_test.py +0 -0
  96. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/print_tree.py +0 -0
  97. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/prune_tree.py +0 -0
  98. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/quartet_network.py +0 -0
  99. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/relative_rate_test.py +0 -0
  100. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/rename_tree_tips.py +0 -0
  101. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/rf_distance.py +0 -0
  102. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/root_tree.py +0 -0
  103. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/saturation.py +0 -0
  104. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/spectral_discordance.py +0 -0
  105. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/spurious_sequence.py +0 -0
  106. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/terminal_branch_stats.py +0 -0
  107. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/threshold_model.py +0 -0
  108. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/tip_labels.py +0 -0
  109. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/tip_to_tip_distance.py +0 -0
  110. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/tip_to_tip_node_distance.py +0 -0
  111. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/total_tree_length.py +0 -0
  112. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/treeness.py +0 -0
  113. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/treeness_over_rcv.py +0 -0
  114. {phykit-2.1.47 → phykit-2.1.49}/phykit/services/tree/vcv_utils.py +0 -0
  115. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/SOURCES.txt +0 -0
  116. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/dependency_links.txt +0 -0
  117. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/entry_points.txt +0 -0
  118. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/requires.txt +0 -0
  119. {phykit-2.1.47 → phykit-2.1.49}/phykit.egg-info/top_level.txt +0 -0
  120. {phykit-2.1.47 → phykit-2.1.49}/setup.cfg +0 -0
  121. {phykit-2.1.47 → phykit-2.1.49}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: phykit
3
- Version: 2.1.47
3
+ Version: 2.1.49
4
4
  Home-page: https://github.com/jlsteenwyk/phykit
5
5
  Author: Jacob L. Steenwyk
6
6
  Author-email: jlsteenwyk@gmail.com
@@ -14,6 +14,22 @@ Classifier: Topic :: Scientific/Engineering
14
14
  Requires-Python: >=3.11
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE.md
17
+ Requires-Dist: biopython>=1.82
18
+ Requires-Dist: matplotlib>=3.7.0
19
+ Requires-Dist: numpy>=1.24.0
20
+ Requires-Dist: scipy>=1.11.3
21
+ Requires-Dist: scikit-learn>=1.4.2
22
+ Requires-Dist: umap-learn>=0.5.0
23
+ Requires-Dist: tqdm>=4.65.0
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: license-file
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
17
33
 
18
34
  <p align="center">
19
35
  <a href="https://github.com/jlsteenwyk/phykit">
@@ -23,6 +23,7 @@ class PlotConfig:
23
23
  title_fontsize: Optional[float] = None
24
24
  axis_fontsize: Optional[float] = None
25
25
  colors: Optional[List[str]] = None
26
+ ladderize: bool = False
26
27
 
27
28
  def validate(self) -> None:
28
29
  if self.fig_width is not None and self.fig_width <= 0:
@@ -187,6 +188,7 @@ class PlotConfig:
187
188
  title_fontsize=getattr(args, "title_fontsize", None),
188
189
  axis_fontsize=getattr(args, "axis_fontsize", None),
189
190
  colors=colors,
191
+ ladderize=getattr(args, "ladderize", False),
190
192
  )
191
193
  config.validate()
192
194
  return config
@@ -205,3 +207,4 @@ def add_plot_arguments(parser) -> None:
205
207
  group.add_argument("--title-fontsize", type=float, default=None, help="Font size for the title")
206
208
  group.add_argument("--axis-fontsize", type=float, default=None, help="Font size for axis labels")
207
209
  group.add_argument("--colors", type=str, default=None, help="Comma-separated colors (hex or named)")
210
+ group.add_argument("--ladderize", action="store_true", default=False, help="Ladderize (sort) the tree before plotting")
@@ -2,8 +2,8 @@
2
2
  Shared utilities for quartet concordance factor computation and ASTRAL parsing.
3
3
 
4
4
  Provides gene concordance factor (gCF/gDF1/gDF2) computation via the
5
- four-group bipartition decomposition, and parsing of ASTRAL -t 2
6
- q1/q2/q3 annotations from Newick node labels.
5
+ four-group bipartition decomposition, and parsing of ASTRAL -t 2 or
6
+ wASTRAL --support 3 q1/q2/q3 annotations from Newick node labels.
7
7
  """
8
8
  from typing import Dict, List, Optional, Tuple
9
9
 
@@ -93,10 +93,11 @@ def compute_gcf_per_node(
93
93
  def parse_astral_annotations(
94
94
  tree,
95
95
  ) -> Dict[int, Tuple[float, float, float]]:
96
- """Parse q1/q2/q3 annotations from ASTRAL -t 2 Newick node labels.
96
+ """Parse q1/q2/q3 annotations from ASTRAL/wASTRAL Newick node labels.
97
97
 
98
- ASTRAL annotates internal nodes with formats like:
98
+ Supports ASTRAL -t 2 and wASTRAL --support 3 output formats:
99
99
  '[q1=0.5;q2=0.3;q3=0.2;f1=50;...]'
100
+ '[CULength=2.6;f1=108;...;q1=0.96;q2=0.03;q3=0.01]'
100
101
  'q1=0.5;q2=0.3;q3=0.2'
101
102
 
102
103
  Returns dict mapping clade id -> (q1, q2, q3).
@@ -464,7 +464,7 @@ class Phykit:
464
464
  [--legend-position <str>]
465
465
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
466
466
  [--title-fontsize <float>] [--axis-fontsize <float>]
467
- [--colors <str>]
467
+ [--colors <str>] [--ladderize]
468
468
  [--json]
469
469
 
470
470
  Options
@@ -512,6 +512,9 @@ class Phykit:
512
512
  (hex or named, e.g.,
513
513
  "#ff0000,blue,#00ff00")
514
514
 
515
+ --ladderize ladderize (sort) the tree
516
+ before plotting
517
+
515
518
  --json optional argument to output
516
519
  results as JSON
517
520
  """
@@ -816,7 +819,7 @@ class Phykit:
816
819
  [--legend-position <str>]
817
820
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
818
821
  [--title-fontsize <float>] [--axis-fontsize <float>]
819
- [--colors <str>]
822
+ [--colors <str>] [--ladderize]
820
823
  [--json]
821
824
 
822
825
  Options
@@ -862,6 +865,9 @@ class Phykit:
862
865
  (hex or named, e.g.,
863
866
  "#ff0000,blue,#00ff00")
864
867
 
868
+ --ladderize ladderize (sort) the tree
869
+ before plotting
870
+
865
871
  --json optional argument to output
866
872
  results as JSON
867
873
  """
@@ -947,7 +953,7 @@ class Phykit:
947
953
  [--legend-position <str>]
948
954
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
949
955
  [--title-fontsize <float>] [--axis-fontsize <float>]
950
- [--colors <str>]
956
+ [--colors <str>] [--ladderize]
951
957
  [--json]
952
958
 
953
959
  Options
@@ -992,6 +998,9 @@ class Phykit:
992
998
  (hex or named, e.g.,
993
999
  "#ff0000,blue,#00ff00")
994
1000
 
1001
+ --ladderize ladderize (sort) the tree
1002
+ before plotting
1003
+
995
1004
  --json optional argument to output
996
1005
  results as JSON
997
1006
  """
@@ -1298,7 +1307,7 @@ class Phykit:
1298
1307
  [--legend-position <str>]
1299
1308
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
1300
1309
  [--title-fontsize <float>] [--axis-fontsize <float>]
1301
- [--colors <str>]
1310
+ [--colors <str>] [--ladderize]
1302
1311
  [--json]
1303
1312
 
1304
1313
  Options
@@ -1348,6 +1357,9 @@ class Phykit:
1348
1357
  (hex or named, e.g.,
1349
1358
  "#ff0000,blue,#00ff00")
1350
1359
 
1360
+ --ladderize ladderize (sort) the tree
1361
+ before plotting
1362
+
1351
1363
  --json optional argument to output
1352
1364
  results as JSON
1353
1365
  """
@@ -1485,7 +1497,7 @@ class Phykit:
1485
1497
  [--legend-position <str>]
1486
1498
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
1487
1499
  [--title-fontsize <float>] [--axis-fontsize <float>]
1488
- [--colors <str>]
1500
+ [--colors <str>] [--ladderize]
1489
1501
  [--json]
1490
1502
 
1491
1503
  Options
@@ -1530,6 +1542,9 @@ class Phykit:
1530
1542
  (hex or named, e.g.,
1531
1543
  "#ff0000,blue,#00ff00")
1532
1544
 
1545
+ --ladderize ladderize (sort) the tree
1546
+ before plotting
1547
+
1533
1548
  --json optional argument to output
1534
1549
  results as JSON
1535
1550
  """
@@ -1831,7 +1846,7 @@ class Phykit:
1831
1846
  [--legend-position <str>]
1832
1847
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
1833
1848
  [--title-fontsize <float>] [--axis-fontsize <float>]
1834
- [--colors <str>]
1849
+ [--colors <str>] [--ladderize]
1835
1850
  [--json]
1836
1851
 
1837
1852
  Options
@@ -1888,6 +1903,9 @@ class Phykit:
1888
1903
  (hex or named, e.g.,
1889
1904
  "#ff0000,blue,#00ff00")
1890
1905
 
1906
+ --ladderize ladderize (sort) the tree
1907
+ before plotting
1908
+
1891
1909
  --json output results as JSON
1892
1910
  """
1893
1911
  ),
@@ -1961,7 +1979,7 @@ class Phykit:
1961
1979
  [--legend-position <str>]
1962
1980
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
1963
1981
  [--title-fontsize <float>] [--axis-fontsize <float>]
1964
- [--colors <str>]
1982
+ [--colors <str>] [--ladderize]
1965
1983
  [--json]
1966
1984
 
1967
1985
  Options
@@ -2019,6 +2037,9 @@ class Phykit:
2019
2037
  (hex or named, e.g.,
2020
2038
  "#ff0000,blue,#00ff00")
2021
2039
 
2040
+ --ladderize ladderize (sort) the tree
2041
+ before plotting
2042
+
2022
2043
  --json output results as JSON
2023
2044
  """
2024
2045
  ),
@@ -2249,7 +2270,7 @@ class Phykit:
2249
2270
  [--legend-position <str>]
2250
2271
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
2251
2272
  [--title-fontsize <float>] [--axis-fontsize <float>]
2252
- [--colors <str>]
2273
+ [--colors <str>] [--ladderize]
2253
2274
  [--json]
2254
2275
 
2255
2276
  Options
@@ -2307,6 +2328,9 @@ class Phykit:
2307
2328
  (hex or named, e.g.,
2308
2329
  "#ff0000,blue,#00ff00")
2309
2330
 
2331
+ --ladderize ladderize (sort) the tree
2332
+ before plotting
2333
+
2310
2334
  --json optional argument to output
2311
2335
  results as JSON
2312
2336
  """
@@ -2920,7 +2944,7 @@ class Phykit:
2920
2944
  [--legend-position <str>]
2921
2945
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
2922
2946
  [--title-fontsize <float>] [--axis-fontsize <float>]
2923
- [--colors <str>]
2947
+ [--colors <str>] [--ladderize]
2924
2948
  [--json]
2925
2949
 
2926
2950
  Options
@@ -3006,6 +3030,9 @@ class Phykit:
3006
3030
  (hex or named, e.g.,
3007
3031
  "#ff0000,blue,#00ff00")
3008
3032
 
3033
+ --ladderize ladderize (sort) the tree
3034
+ before plotting
3035
+
3009
3036
  --json optional argument to output
3010
3037
  results as JSON
3011
3038
  """
@@ -3255,7 +3282,7 @@ class Phykit:
3255
3282
  [--legend-position <str>]
3256
3283
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
3257
3284
  [--title-fontsize <float>] [--axis-fontsize <float>]
3258
- [--colors <str>]
3285
+ [--colors <str>] [--ladderize]
3259
3286
  [--json]
3260
3287
 
3261
3288
  Options
@@ -3307,6 +3334,9 @@ class Phykit:
3307
3334
  (hex or named, e.g.,
3308
3335
  "#ff0000,blue,#00ff00")
3309
3336
 
3337
+ --ladderize ladderize (sort) the tree
3338
+ before plotting
3339
+
3310
3340
  --json optional argument to output
3311
3341
  results as JSON
3312
3342
  """
@@ -3606,7 +3636,7 @@ class Phykit:
3606
3636
  [--legend-position <str>]
3607
3637
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
3608
3638
  [--title-fontsize <float>] [--axis-fontsize <float>]
3609
- [--colors <str>]
3639
+ [--colors <str>] [--ladderize]
3610
3640
  [--json]
3611
3641
 
3612
3642
  Options
@@ -3661,6 +3691,9 @@ class Phykit:
3661
3691
  (hex or named, e.g.,
3662
3692
  "#ff0000,blue,#00ff00")
3663
3693
 
3694
+ --ladderize ladderize (sort) the tree
3695
+ before plotting
3696
+
3664
3697
  --json optional argument to output
3665
3698
  results as JSON
3666
3699
  """
@@ -3731,7 +3764,7 @@ class Phykit:
3731
3764
  [--legend-position <str>]
3732
3765
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
3733
3766
  [--title-fontsize <float>] [--axis-fontsize <float>]
3734
- [--colors <str>]
3767
+ [--colors <str>] [--ladderize]
3735
3768
  [--json]
3736
3769
 
3737
3770
  Options
@@ -3774,6 +3807,9 @@ class Phykit:
3774
3807
  (hex or named, e.g.,
3775
3808
  "#ff0000,blue,#00ff00")
3776
3809
 
3810
+ --ladderize ladderize (sort) the tree
3811
+ before plotting
3812
+
3777
3813
  --json optional argument to also
3778
3814
  output results as JSON
3779
3815
  """
@@ -3823,7 +3859,7 @@ class Phykit:
3823
3859
  [--legend-position <str>]
3824
3860
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
3825
3861
  [--title-fontsize <float>] [--axis-fontsize <float>]
3826
- [--colors <str>]
3862
+ [--colors <str>] [--ladderize]
3827
3863
  [--json]
3828
3864
 
3829
3865
  Options
@@ -3876,6 +3912,9 @@ class Phykit:
3876
3912
  (hex or named, e.g.,
3877
3913
  "#ff0000,blue,#00ff00")
3878
3914
 
3915
+ --ladderize ladderize (sort) the tree
3916
+ before plotting
3917
+
3879
3918
  --json optional argument to also
3880
3919
  output results as JSON
3881
3920
  """
@@ -3930,7 +3969,7 @@ class Phykit:
3930
3969
  [--legend-position <str>]
3931
3970
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
3932
3971
  [--title-fontsize <float>] [--axis-fontsize <float>]
3933
- [--colors <str>]
3972
+ [--colors <str>] [--ladderize]
3934
3973
  [--json]
3935
3974
 
3936
3975
  Options
@@ -3973,6 +4012,9 @@ class Phykit:
3973
4012
  (hex or named, e.g.,
3974
4013
  "#ff0000,blue,#00ff00")
3975
4014
 
4015
+ --ladderize ladderize (sort) the tree
4016
+ before plotting
4017
+
3976
4018
  --json optional argument to output
3977
4019
  results as JSON
3978
4020
  """
@@ -4019,7 +4061,7 @@ class Phykit:
4019
4061
  [--legend-position <str>]
4020
4062
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
4021
4063
  [--title-fontsize <float>] [--axis-fontsize <float>]
4022
- [--colors <str>]
4064
+ [--colors <str>] [--ladderize]
4023
4065
  [--json]
4024
4066
 
4025
4067
  Options
@@ -4065,6 +4107,9 @@ class Phykit:
4065
4107
  (hex or named, e.g.,
4066
4108
  "#ff0000,blue,#00ff00")
4067
4109
 
4110
+ --ladderize ladderize (sort) the tree
4111
+ before plotting
4112
+
4068
4113
  --json optional argument to output
4069
4114
  results as JSON
4070
4115
  """
@@ -4118,7 +4163,7 @@ class Phykit:
4118
4163
  [--legend-position <str>]
4119
4164
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
4120
4165
  [--title-fontsize <float>] [--axis-fontsize <float>]
4121
- [--colors <str>]
4166
+ [--colors <str>] [--ladderize]
4122
4167
  [--json]
4123
4168
 
4124
4169
  Options
@@ -4170,6 +4215,9 @@ class Phykit:
4170
4215
  (hex or named, e.g.,
4171
4216
  "#ff0000,blue,#00ff00")
4172
4217
 
4218
+ --ladderize ladderize (sort) the tree
4219
+ before plotting
4220
+
4173
4221
  --json optional argument to output
4174
4222
  results as JSON
4175
4223
  """
@@ -4651,7 +4699,7 @@ class Phykit:
4651
4699
  [--legend-position <str>]
4652
4700
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
4653
4701
  [--title-fontsize <float>] [--axis-fontsize <float>]
4654
- [--colors <str>]
4702
+ [--colors <str>] [--ladderize]
4655
4703
  [--json]
4656
4704
 
4657
4705
  Options
@@ -4702,6 +4750,9 @@ class Phykit:
4702
4750
  (hex or named, e.g.,
4703
4751
  "#ff0000,blue,#00ff00")
4704
4752
 
4753
+ --ladderize ladderize (sort) the tree
4754
+ before plotting
4755
+
4705
4756
  --json optional argument to output
4706
4757
  results as JSON
4707
4758
  """
@@ -4747,7 +4798,8 @@ class Phykit:
4747
4798
  In native mode (-g provided), computes gene concordance
4748
4799
  factors (gCF, gDF1, gDF2) from a species tree and gene
4749
4800
  trees via bipartition matching. In ASTRAL mode (no -g),
4750
- parses q1/q2/q3 annotations from ASTRAL -t 2 output.
4801
+ parses q1/q2/q3 annotations from ASTRAL -t 2 output or
4802
+ wASTRAL --support 3 output.
4751
4803
 
4752
4804
  Pie slices show: concordant (blue), discordant alt 1
4753
4805
  (red), discordant alt 2 (gray).
@@ -4765,7 +4817,7 @@ class Phykit:
4765
4817
  [--legend-position <str>]
4766
4818
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
4767
4819
  [--title-fontsize <float>] [--axis-fontsize <float>]
4768
- [--colors <str>]
4820
+ [--colors <str>] [--ladderize]
4769
4821
 
4770
4822
  Options
4771
4823
  =====================================================
@@ -4773,7 +4825,8 @@ class Phykit:
4773
4825
 
4774
4826
  -g/--gene-trees gene trees file, one Newick
4775
4827
  tree per line (optional;
4776
- if omitted, ASTRAL -t 2
4828
+ if omitted, ASTRAL -t 2 or
4829
+ wASTRAL --support 3
4777
4830
  annotations are parsed)
4778
4831
 
4779
4832
  -o/--output output figure path (required;
@@ -4813,6 +4866,9 @@ class Phykit:
4813
4866
  (default: "#2b8cbe,#d62728,
4814
4867
  #969696")
4815
4868
 
4869
+ --ladderize ladderize (sort) the tree
4870
+ before plotting
4871
+
4816
4872
  --json optional argument to output
4817
4873
  per-node concordance as JSON
4818
4874
  """
@@ -4877,7 +4933,7 @@ class Phykit:
4877
4933
  [--legend-position <str>]
4878
4934
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
4879
4935
  [--title-fontsize <float>] [--axis-fontsize <float>]
4880
- [--colors <str>]
4936
+ [--colors <str>] [--ladderize]
4881
4937
  [--json]
4882
4938
 
4883
4939
  Options
@@ -4934,6 +4990,9 @@ class Phykit:
4934
4990
  (hex or named, e.g.,
4935
4991
  "#ff0000,blue,#00ff00")
4936
4992
 
4993
+ --ladderize ladderize (sort) the tree
4994
+ before plotting
4995
+
4937
4996
  --json optional argument to output
4938
4997
  results as JSON
4939
4998
  """
@@ -5094,7 +5153,7 @@ class Phykit:
5094
5153
  [--legend-position <str>]
5095
5154
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
5096
5155
  [--title-fontsize <float>] [--axis-fontsize <float>]
5097
- [--colors <str>]
5156
+ [--colors <str>] [--ladderize]
5098
5157
  [--json]
5099
5158
 
5100
5159
  Options
@@ -5140,6 +5199,9 @@ class Phykit:
5140
5199
  (hex or named, e.g.,
5141
5200
  "#ff0000,blue,#00ff00")
5142
5201
 
5202
+ --ladderize ladderize (sort) the tree
5203
+ before plotting
5204
+
5143
5205
  --json optional argument to output
5144
5206
  results as JSON
5145
5207
  """
@@ -5248,7 +5310,7 @@ class Phykit:
5248
5310
  [--legend-position <str>]
5249
5311
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
5250
5312
  [--title-fontsize <float>] [--axis-fontsize <float>]
5251
- [--colors <str>]
5313
+ [--colors <str>] [--ladderize]
5252
5314
  [--json]
5253
5315
 
5254
5316
  Options
@@ -5296,6 +5358,9 @@ class Phykit:
5296
5358
  (hex or named, e.g.,
5297
5359
  "#ff0000,blue,#00ff00")
5298
5360
 
5361
+ --ladderize ladderize (sort) the tree
5362
+ before plotting
5363
+
5299
5364
  --json optional argument to output
5300
5365
  results as JSON
5301
5366
  """
@@ -5355,7 +5420,7 @@ class Phykit:
5355
5420
  [--legend-position <str>]
5356
5421
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
5357
5422
  [--title-fontsize <float>] [--axis-fontsize <float>]
5358
- [--colors <str>]
5423
+ [--colors <str>] [--ladderize]
5359
5424
  [--json]
5360
5425
 
5361
5426
  Options
@@ -5419,6 +5484,9 @@ class Phykit:
5419
5484
  (hex or named, e.g.,
5420
5485
  "#ff0000,blue,#00ff00")
5421
5486
 
5487
+ --ladderize ladderize (sort) the tree
5488
+ before plotting
5489
+
5422
5490
  --json optional argument to output
5423
5491
  results as JSON
5424
5492
  """
@@ -5818,7 +5886,7 @@ class Phykit:
5818
5886
  [--legend-position <str>]
5819
5887
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
5820
5888
  [--title-fontsize <float>] [--axis-fontsize <float>]
5821
- [--colors <str>]
5889
+ [--colors <str>] [--ladderize]
5822
5890
  [--json]
5823
5891
 
5824
5892
  Options
@@ -5875,6 +5943,9 @@ class Phykit:
5875
5943
  (hex or named, e.g.,
5876
5944
  "#ff0000,blue,#00ff00")
5877
5945
 
5946
+ --ladderize ladderize (sort) the tree
5947
+ before plotting
5948
+
5878
5949
  --json optional argument to output
5879
5950
  results as JSON
5880
5951
  """
@@ -6054,7 +6125,7 @@ class Phykit:
6054
6125
  [--legend-position <str>]
6055
6126
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
6056
6127
  [--title-fontsize <float>] [--axis-fontsize <float>]
6057
- [--colors <str>]
6128
+ [--colors <str>] [--ladderize]
6058
6129
  [--json]
6059
6130
 
6060
6131
  Options
@@ -6105,6 +6176,9 @@ class Phykit:
6105
6176
  (hex or named, e.g.,
6106
6177
  "#ff0000,blue,#00ff00")
6107
6178
 
6179
+ --ladderize ladderize (sort) the tree
6180
+ before plotting
6181
+
6108
6182
  --json optional argument to output
6109
6183
  results as JSON
6110
6184
  """
@@ -6223,7 +6297,7 @@ class Phykit:
6223
6297
  [--legend-position <str>]
6224
6298
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
6225
6299
  [--title-fontsize <float>] [--axis-fontsize <float>]
6226
- [--colors <str>]
6300
+ [--colors <str>] [--ladderize]
6227
6301
  [--json]
6228
6302
 
6229
6303
  Options
@@ -6268,6 +6342,9 @@ class Phykit:
6268
6342
  (hex or named, e.g.,
6269
6343
  "#ff0000,blue,#00ff00")
6270
6344
 
6345
+ --ladderize ladderize (sort) the tree
6346
+ before plotting
6347
+
6271
6348
  --json optional argument to output
6272
6349
  results as JSON
6273
6350
  """
@@ -6323,7 +6400,7 @@ class Phykit:
6323
6400
  [--legend-position <str>]
6324
6401
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
6325
6402
  [--title-fontsize <float>] [--axis-fontsize <float>]
6326
- [--colors <str>]
6403
+ [--colors <str>] [--ladderize]
6327
6404
  [--json]
6328
6405
 
6329
6406
  Options
@@ -6367,6 +6444,9 @@ class Phykit:
6367
6444
  (hex or named, e.g.,
6368
6445
  "#ff0000,blue,#00ff00")
6369
6446
 
6447
+ --ladderize ladderize (sort) the tree
6448
+ before plotting
6449
+
6370
6450
  --json optional argument to output
6371
6451
  results as JSON
6372
6452
  """
@@ -6423,7 +6503,7 @@ class Phykit:
6423
6503
  [--legend-position <str>]
6424
6504
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
6425
6505
  [--title-fontsize <float>] [--axis-fontsize <float>]
6426
- [--colors <str>]
6506
+ [--colors <str>] [--ladderize]
6427
6507
  [--json]
6428
6508
 
6429
6509
  Options
@@ -6481,6 +6561,9 @@ class Phykit:
6481
6561
  (hex or named, e.g.,
6482
6562
  "#ff0000,blue,#00ff00")
6483
6563
 
6564
+ --ladderize ladderize (sort) the tree
6565
+ before plotting
6566
+
6484
6567
  --json output results as JSON
6485
6568
  """
6486
6569
  ),
@@ -6554,7 +6637,7 @@ class Phykit:
6554
6637
  [--legend-position <str>]
6555
6638
  [--ylabel-fontsize <float>] [--xlabel-fontsize <float>]
6556
6639
  [--title-fontsize <float>] [--axis-fontsize <float>]
6557
- [--colors <str>]
6640
+ [--colors <str>] [--ladderize]
6558
6641
 
6559
6642
  Options
6560
6643
  =====================================================
@@ -6614,6 +6697,9 @@ class Phykit:
6614
6697
  (hex or named, e.g.,
6615
6698
  "#ff0000,blue,#00ff00")
6616
6699
 
6700
+ --ladderize ladderize (sort) the tree
6701
+ before plotting
6702
+
6617
6703
  --json optional argument to output
6618
6704
  results as JSON
6619
6705
  """
@@ -66,6 +66,9 @@ class AncestralReconstruction(Tree):
66
66
  if tips_to_prune:
67
67
  tree_copy = self.prune_tree_using_taxa_list(tree_copy, tips_to_prune)
68
68
 
69
+ if self.plot_config.ladderize:
70
+ tree_copy.ladderize()
71
+
69
72
  # Label internal nodes
70
73
  node_labels = self._label_internal_nodes(tree_copy)
71
74
 
@@ -1206,6 +1209,9 @@ class AncestralReconstruction(Tree):
1206
1209
  if tips_to_prune:
1207
1210
  tree_copy = self.prune_tree_using_taxa_list(tree_copy, tips_to_prune)
1208
1211
 
1212
+ if self.plot_config.ladderize:
1213
+ tree_copy.ladderize()
1214
+
1209
1215
  # Label internal nodes
1210
1216
  node_labels = self._label_internal_nodes(tree_copy)
1211
1217
 
@@ -101,6 +101,9 @@ class ConcordanceAsr(Tree):
101
101
  species_copy, tips_to_prune
102
102
  )
103
103
 
104
+ if self.plot_config.ladderize:
105
+ species_copy.ladderize()
106
+
104
107
  if self.method == "distribution":
105
108
  result = self._run_distribution(
106
109
  species_copy, gene_trees, trait_values, all_taxa
@@ -40,6 +40,9 @@ class ContMap(Tree):
40
40
  if tips_to_prune:
41
41
  tree_copy = self.prune_tree_using_taxa_list(tree_copy, tips_to_prune)
42
42
 
43
+ if self.plot_config.ladderize:
44
+ tree_copy.ladderize()
45
+
43
46
  # Label internal nodes
44
47
  node_labels = self._label_internal_nodes(tree_copy)
45
48
 
@@ -84,6 +84,10 @@ class Cophylo(Tree):
84
84
  n_tips1 = len(tips1)
85
85
  n_tips2 = len(tips2)
86
86
 
87
+ if self.plot_config.ladderize:
88
+ tree1.ladderize()
89
+ tree2.ladderize()
90
+
87
91
  # Optimize tip ordering to reduce line crossings
88
92
  tree1_order, tree2_order = self._optimize_tip_order(
89
93
  tree1, tree2, mapping_valid
@@ -64,6 +64,9 @@ class DensityMap(Tree):
64
64
  for tip_name in tips_to_prune:
65
65
  tree.prune(tip_name)
66
66
 
67
+ if self.plot_config.ladderize:
68
+ tree.ladderize()
69
+
67
70
  # Fit Q matrix using ER model
68
71
  Q, loglik = scm._fit_q_matrix(tree, tip_states, states, "ER")
69
72
  k = len(states)
@@ -85,6 +85,8 @@ class DiscordanceAsymmetry(Tree):
85
85
  self._output_text(branch_results, summary)
86
86
 
87
87
  if self.plot_output:
88
+ if self.plot_config.ladderize:
89
+ species_tree.ladderize()
88
90
  self._plot(species_tree, branch_results, self.plot_output,
89
91
  shared_taxa=shared_taxa)
90
92
 
@@ -43,6 +43,9 @@ class PhyloHeatmap(Tree):
43
43
  if tips_to_prune:
44
44
  tree = self.prune_tree_using_taxa_list(tree, tips_to_prune)
45
45
 
46
+ if self.plot_config.ladderize:
47
+ tree.ladderize()
48
+
46
49
  # Get tip order from tree traversal
47
50
  tip_order = [t.name for t in tree.get_terminals()]
48
51
 
@@ -5,7 +5,7 @@ Draws a phylogram with pie charts at internal nodes showing the
5
5
  proportion of gene trees supporting the species tree topology (gCF)
6
6
  versus the two NNI alternative topologies (gDF1, gDF2). Supports
7
7
  both native computation from gene trees and parsing of ASTRAL -t 2
8
- annotations.
8
+ or wASTRAL --support 3 annotations.
9
9
  """
10
10
  import sys
11
11
  from typing import Dict, List, Tuple
@@ -50,7 +50,8 @@ class QuartetPie(Tree):
50
50
  [
51
51
  "No ASTRAL q1/q2/q3 annotations found in the tree.",
52
52
  "Either provide gene trees with -g, or use an ASTRAL",
53
- "-t 2 output tree with quartet annotations.",
53
+ "-t 2 or wASTRAL --support 3 output tree with quartet",
54
+ "annotations.",
54
55
  ],
55
56
  code=2,
56
57
  )
@@ -62,6 +63,9 @@ class QuartetPie(Tree):
62
63
  input_mode = "astral"
63
64
  n_gene_trees = 0
64
65
 
66
+ if self.plot_config.ladderize:
67
+ tree.ladderize()
68
+
65
69
  self._plot_quartet_pie(tree, proportions, self.output_path)
66
70
 
67
71
  if self.json_output:
@@ -108,6 +108,9 @@ class RateHeterogeneity(Tree):
108
108
 
109
109
  # Plot
110
110
  if self.plot_output:
111
+ if self.plot_config.ladderize:
112
+ tree_copy.ladderize()
113
+ parent_map = self._build_parent_map(tree_copy)
111
114
  self._plot_regime_tree(
112
115
  tree_copy, branch_regimes, regimes, parent_map, self.plot_output
113
116
  )
@@ -67,6 +67,9 @@ class StochasticCharacterMap(Tree):
67
67
  for tip_name in tips_to_prune:
68
68
  tree.prune(tip_name)
69
69
 
70
+ if self.plot_config.ladderize:
71
+ tree.ladderize()
72
+
70
73
  # Fit Q matrix
71
74
  Q, loglik = self._fit_q_matrix(tree, tip_states, states, self.model)
72
75
  k = len(states)
@@ -0,0 +1 @@
1
+ __version__ = "2.1.49"
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: phykit
3
- Version: 2.1.47
3
+ Version: 2.1.49
4
4
  Home-page: https://github.com/jlsteenwyk/phykit
5
5
  Author: Jacob L. Steenwyk
6
6
  Author-email: jlsteenwyk@gmail.com
@@ -14,6 +14,22 @@ Classifier: Topic :: Scientific/Engineering
14
14
  Requires-Python: >=3.11
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE.md
17
+ Requires-Dist: biopython>=1.82
18
+ Requires-Dist: matplotlib>=3.7.0
19
+ Requires-Dist: numpy>=1.24.0
20
+ Requires-Dist: scipy>=1.11.3
21
+ Requires-Dist: scikit-learn>=1.4.2
22
+ Requires-Dist: umap-learn>=0.5.0
23
+ Requires-Dist: tqdm>=4.65.0
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: license-file
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
17
33
 
18
34
  <p align="center">
19
35
  <a href="https://github.com/jlsteenwyk/phykit">
@@ -1 +0,0 @@
1
- __version__ = "2.1.47"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes