phykit 2.1.79__tar.gz → 2.1.81__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.
- {phykit-2.1.79 → phykit-2.1.81}/PKG-INFO +1 -1
- {phykit-2.1.79 → phykit-2.1.81}/phykit/cli_registry.py +4 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/quartet_utils.py +36 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/phykit.py +95 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/service_factories.py +1 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/__init__.py +1 -0
- phykit-2.1.81/phykit/services/tree/phylo_anova.py +808 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/quartet_pie.py +83 -6
- phykit-2.1.81/phykit/version.py +1 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/PKG-INFO +1 -1
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/SOURCES.txt +1 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/entry_points.txt +4 -0
- {phykit-2.1.79 → phykit-2.1.81}/setup.py +4 -0
- phykit-2.1.79/phykit/version.py +0 -1
- {phykit-2.1.79 → phykit-2.1.81}/LICENSE.md +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/README.md +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/__init__.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/__main__.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/errors.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/__init__.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/boolean_argument_parsing.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/caching.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/circular_layout.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/color_annotations.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/discrete_models.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/files.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/json_output.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/parallel.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/parsimony_utils.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/plot_config.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/stats_summary.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/helpers/streaming.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/__init__.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/__init__.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_entropy.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_length.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_length_no_gaps.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_outlier_taxa.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_recoding.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/alignment_subsample.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/base.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/column_score.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/composition_per_taxon.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/compositional_bias_per_site.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/create_concatenation_matrix.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dfoil.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dna_threader.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/dstatistic.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/evolutionary_rate_per_site.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/faidx.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/gc_content.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/identity_matrix.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/mask_alignment.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/occupancy_per_taxon.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/pairwise_identity.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/parsimony_informative_sites.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/phylo_gwas.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/plot_alignment_qc.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rcv.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rcvt.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/rename_fasta_entries.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/sum_of_pairs_score.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/taxon_groups.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/alignment/variable_sites.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/base.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ancestral_reconstruction.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/base.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/bipartition_support_stats.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/branch_length_multiplier.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/character_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/collapse_branches.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/concordance_asr.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/consensus_network.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/consensus_tree.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/cont_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/cophylo.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/covarying_evolutionary_rates.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/density_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/discordance_asymmetry.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/dvmc.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/evo_tempo_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/evolutionary_rate.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/fit_continuous.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/fit_discrete.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/hidden_paralogy_check.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/hybridization.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/independent_contrasts.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/internal_branch_stats.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/internode_labeler.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/kf_distance.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/last_common_ancestor_subtree.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/lb_score.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ltt.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/monophyly_check.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/nearest_neighbor_interchange.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/neighbor_net.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/network_signal.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ou_shift_detection.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/ouwie.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/parsimony_score.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/patristic_distances.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phenogram.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_heatmap.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_impute.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylo_logistic.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_glm.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_ordination.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_regression.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylogenetic_signal.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/phylomorphospace.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/polytomy_test.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/print_tree.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/prune_tree.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/quartet_network.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rate_heterogeneity.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/relative_rate_test.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rename_tree_tips.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/rf_distance.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/root_tree.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/saturation.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spectral_discordance.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spr.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/spurious_sequence.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/stochastic_character_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/terminal_branch_stats.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/threshold_model.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_labels.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_distance.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_node_distance.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/total_tree_length.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/trait_correlation.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/trait_rate_map.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/tree_space.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/treeness.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/treeness_over_rcv.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit/services/tree/vcv_utils.py +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/dependency_links.txt +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/requires.txt +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/phykit.egg-info/top_level.txt +0 -0
- {phykit-2.1.79 → phykit-2.1.81}/setup.cfg +0 -0
|
@@ -55,6 +55,10 @@ ALIAS_TO_HANDLER: Dict[str, str] = {
|
|
|
55
55
|
"sum_of_pairs_score": "sum_of_pairs_score",
|
|
56
56
|
"sops": "sum_of_pairs_score",
|
|
57
57
|
"sop": "sum_of_pairs_score",
|
|
58
|
+
"phylo_anova": "phylo_anova",
|
|
59
|
+
"panova": "phylo_anova",
|
|
60
|
+
"phylo_manova": "phylo_anova",
|
|
61
|
+
"pmanova": "phylo_anova",
|
|
58
62
|
"phylo_gwas": "phylo_gwas",
|
|
59
63
|
"pgwas": "phylo_gwas",
|
|
60
64
|
"vs": "variable_sites",
|
|
@@ -114,6 +114,42 @@ def parse_astral_annotations(
|
|
|
114
114
|
return result
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
def parse_astral_branch_info(
|
|
118
|
+
tree,
|
|
119
|
+
) -> Dict[int, Dict[str, float]]:
|
|
120
|
+
"""Parse f1 (concordant count) and pp1 (LPP) from ASTRAL/wASTRAL labels.
|
|
121
|
+
|
|
122
|
+
Returns dict mapping clade id -> {"f1": ..., "pp1": ...}.
|
|
123
|
+
Keys are only present if the value was found in the annotation.
|
|
124
|
+
"""
|
|
125
|
+
result = {}
|
|
126
|
+
for clade in tree.find_clades(order="preorder"):
|
|
127
|
+
if clade.is_terminal():
|
|
128
|
+
continue
|
|
129
|
+
label = clade.name or clade.comment or ""
|
|
130
|
+
info = _parse_branch_info_from_label(str(label))
|
|
131
|
+
if info:
|
|
132
|
+
result[id(clade)] = info
|
|
133
|
+
return result
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _parse_branch_info_from_label(label: str) -> Dict[str, float]:
|
|
137
|
+
"""Extract f1, pp1 (and optionally f2, f3, pp2, pp3) from an ASTRAL label."""
|
|
138
|
+
s = label.strip("'\"").strip("[]")
|
|
139
|
+
info = {}
|
|
140
|
+
for part in s.split(";"):
|
|
141
|
+
if "=" not in part:
|
|
142
|
+
continue
|
|
143
|
+
key, val = part.split("=", 1)
|
|
144
|
+
key = key.strip()
|
|
145
|
+
try:
|
|
146
|
+
if key in ("f1", "f2", "f3", "pp1", "pp2", "pp3"):
|
|
147
|
+
info[key] = float(val)
|
|
148
|
+
except ValueError:
|
|
149
|
+
continue
|
|
150
|
+
return info
|
|
151
|
+
|
|
152
|
+
|
|
117
153
|
def _parse_qs_from_label(label: str) -> Optional[Tuple[float, float, float]]:
|
|
118
154
|
"""Extract q1, q2, q3 from an ASTRAL node label string."""
|
|
119
155
|
s = label.strip("'\"").strip("[]")
|
|
@@ -248,6 +248,8 @@ class Phykit:
|
|
|
248
248
|
- fit phylogenetic generalized least squares (PGLS) regression
|
|
249
249
|
phylogenetic_glm (alias: phylo_glm; pglm)
|
|
250
250
|
- fit phylogenetic GLM for binary (logistic) or count (Poisson) data
|
|
251
|
+
phylo_anova (alias: panova; phylo_manova; pmanova)
|
|
252
|
+
- phylogenetic ANOVA / MANOVA using RRPP (Adams & Collyer 2018)
|
|
251
253
|
phylo_logistic (alias: phylo_logreg; plogreg)
|
|
252
254
|
- fit phylogenetic logistic regression (Ives & Garland 2010)
|
|
253
255
|
stochastic_character_map (alias: simmap; scm)
|
|
@@ -2004,6 +2006,87 @@ class Phykit:
|
|
|
2004
2006
|
_add_json_argument(parser)
|
|
2005
2007
|
_run_service(parser, argv, PhyloGwas)
|
|
2006
2008
|
|
|
2009
|
+
@staticmethod
|
|
2010
|
+
def phylo_anova(argv):
|
|
2011
|
+
parser = _new_parser(
|
|
2012
|
+
description=textwrap.dedent(
|
|
2013
|
+
f"""\
|
|
2014
|
+
{help_header}
|
|
2015
|
+
|
|
2016
|
+
Phylogenetic ANOVA / MANOVA using the Residual
|
|
2017
|
+
Randomization Permutation Procedure (RRPP) of
|
|
2018
|
+
Adams & Collyer (2018).
|
|
2019
|
+
|
|
2020
|
+
Tests whether a continuous trait (ANOVA) or multiple
|
|
2021
|
+
traits (MANOVA) differ across discrete groups while
|
|
2022
|
+
accounting for phylogenetic non-independence.
|
|
2023
|
+
|
|
2024
|
+
Auto-detects univariate vs multivariate based on the
|
|
2025
|
+
number of response trait columns. Override with
|
|
2026
|
+
--method anova or --method manova.
|
|
2027
|
+
|
|
2028
|
+
Aliases:
|
|
2029
|
+
phylo_anova, panova, phylo_manova, pmanova
|
|
2030
|
+
Command line interfaces:
|
|
2031
|
+
pk_phylo_anova, pk_panova, pk_phylo_manova, pk_pmanova
|
|
2032
|
+
|
|
2033
|
+
Usage:
|
|
2034
|
+
phykit phylo_anova -t <tree> --traits <traits_file>
|
|
2035
|
+
[--group-column <name>] [--method auto|anova|manova]
|
|
2036
|
+
[--permutations <int>] [--pairwise]
|
|
2037
|
+
[--plot-output <file>] [--plot-type boxplot|phylomorphospace]
|
|
2038
|
+
[--seed <int>] [--json]
|
|
2039
|
+
|
|
2040
|
+
Options
|
|
2041
|
+
=====================================================
|
|
2042
|
+
-t/--tree species tree file (required)
|
|
2043
|
+
|
|
2044
|
+
--traits TSV file with taxon, group
|
|
2045
|
+
column, and one or more
|
|
2046
|
+
response trait columns
|
|
2047
|
+
(required)
|
|
2048
|
+
|
|
2049
|
+
--group-column name of the categorical
|
|
2050
|
+
grouping column (default:
|
|
2051
|
+
first non-taxon column)
|
|
2052
|
+
|
|
2053
|
+
--method analysis method: auto, anova,
|
|
2054
|
+
or manova (default: auto)
|
|
2055
|
+
|
|
2056
|
+
--permutations number of RRPP permutations
|
|
2057
|
+
(default: 1000)
|
|
2058
|
+
|
|
2059
|
+
--pairwise include post-hoc pairwise
|
|
2060
|
+
group comparisons
|
|
2061
|
+
|
|
2062
|
+
--plot-output output figure path
|
|
2063
|
+
(.png, .pdf, .svg)
|
|
2064
|
+
|
|
2065
|
+
--plot-type boxplot or phylomorphospace
|
|
2066
|
+
(default: auto — boxplot for
|
|
2067
|
+
ANOVA, phylomorphospace for
|
|
2068
|
+
MANOVA)
|
|
2069
|
+
|
|
2070
|
+
--seed random seed for reproducible
|
|
2071
|
+
permutations
|
|
2072
|
+
|
|
2073
|
+
--json output results as JSON
|
|
2074
|
+
"""
|
|
2075
|
+
),
|
|
2076
|
+
)
|
|
2077
|
+
parser.add_argument("-t", "--tree", type=str, required=True, help=SUPPRESS, metavar="")
|
|
2078
|
+
parser.add_argument("--traits", type=str, required=True, help=SUPPRESS, metavar="")
|
|
2079
|
+
parser.add_argument("--group-column", type=str, default=None, help=SUPPRESS, metavar="")
|
|
2080
|
+
parser.add_argument("--method", type=str, default="auto", choices=["auto", "anova", "manova"], help=SUPPRESS, metavar="")
|
|
2081
|
+
parser.add_argument("--permutations", type=int, default=1000, help=SUPPRESS, metavar="")
|
|
2082
|
+
parser.add_argument("--pairwise", action="store_true", help=SUPPRESS)
|
|
2083
|
+
parser.add_argument("--plot-output", type=str, default=None, help=SUPPRESS, metavar="")
|
|
2084
|
+
parser.add_argument("--plot-type", type=str, default="auto", choices=["auto", "boxplot", "phylomorphospace"], help=SUPPRESS, metavar="")
|
|
2085
|
+
parser.add_argument("--seed", type=int, default=None, help=SUPPRESS, metavar="")
|
|
2086
|
+
add_plot_arguments(parser)
|
|
2087
|
+
_add_json_argument(parser)
|
|
2088
|
+
_run_service(parser, argv, PhyloAnova)
|
|
2089
|
+
|
|
2007
2090
|
@staticmethod
|
|
2008
2091
|
def alignment_subsample(argv):
|
|
2009
2092
|
parser = _new_parser(
|
|
@@ -6076,6 +6159,11 @@ class Phykit:
|
|
|
6076
6159
|
and branch colors (iTOL-
|
|
6077
6160
|
inspired TSV format)
|
|
6078
6161
|
|
|
6162
|
+
--branch-labels show concordant gene count
|
|
6163
|
+
above and LPP support below
|
|
6164
|
+
each internal branch
|
|
6165
|
+
(PhyTop-style)
|
|
6166
|
+
|
|
6079
6167
|
--csv output per-branch concordance
|
|
6080
6168
|
values as a CSV file
|
|
6081
6169
|
|
|
@@ -6102,6 +6190,9 @@ class Phykit:
|
|
|
6102
6190
|
parser.add_argument(
|
|
6103
6191
|
"--annotate", action="store_true", required=False, help=SUPPRESS
|
|
6104
6192
|
)
|
|
6193
|
+
parser.add_argument(
|
|
6194
|
+
"--branch-labels", action="store_true", required=False, help=SUPPRESS
|
|
6195
|
+
)
|
|
6105
6196
|
parser.add_argument(
|
|
6106
6197
|
"--csv", type=str, required=False, default=None,
|
|
6107
6198
|
help=SUPPRESS, metavar=""
|
|
@@ -8677,6 +8768,10 @@ def phylo_gwas(argv=None):
|
|
|
8677
8768
|
Phykit.phylo_gwas(sys.argv[1:])
|
|
8678
8769
|
|
|
8679
8770
|
|
|
8771
|
+
def phylo_anova(argv=None):
|
|
8772
|
+
Phykit.phylo_anova(sys.argv[1:])
|
|
8773
|
+
|
|
8774
|
+
|
|
8680
8775
|
def dfoil(argv=None):
|
|
8681
8776
|
Phykit.dfoil(sys.argv[1:])
|
|
8682
8777
|
|
|
@@ -44,6 +44,7 @@ RelativeCompositionVariability = _LazyServiceFactory("phykit.services.alignment.
|
|
|
44
44
|
RelativeCompositionVariabilityTaxon = _LazyServiceFactory("phykit.services.alignment.rcvt", "RelativeCompositionVariabilityTaxon")
|
|
45
45
|
RenameFastaEntries = _LazyServiceFactory("phykit.services.alignment.rename_fasta_entries", "RenameFastaEntries")
|
|
46
46
|
SumOfPairsScore = _LazyServiceFactory("phykit.services.alignment.sum_of_pairs_score", "SumOfPairsScore")
|
|
47
|
+
PhyloAnova = _LazyServiceFactory("phykit.services.tree.phylo_anova", "PhyloAnova")
|
|
47
48
|
PhyloGwas = _LazyServiceFactory("phykit.services.alignment.phylo_gwas", "PhyloGwas")
|
|
48
49
|
TaxonGroups = _LazyServiceFactory("phykit.services.alignment.taxon_groups", "TaxonGroups")
|
|
49
50
|
VariableSites = _LazyServiceFactory("phykit.services.alignment.variable_sites", "VariableSites")
|
|
@@ -52,6 +52,7 @@ _EXPORTS = {
|
|
|
52
52
|
"TreenessOverRCV": "treeness_over_rcv",
|
|
53
53
|
"ConcordanceAsr": "concordance_asr",
|
|
54
54
|
"PhyloLogistic": "phylo_logistic",
|
|
55
|
+
"PhyloAnova": "phylo_anova",
|
|
55
56
|
"PhyloImpute": "phylo_impute",
|
|
56
57
|
"TraitCorrelation": "trait_correlation",
|
|
57
58
|
"TraitRateMap": "trait_rate_map",
|