phykit 2.1.80__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.80 → phykit-2.1.81}/PKG-INFO +1 -1
- {phykit-2.1.80 → phykit-2.1.81}/phykit/cli_registry.py +4 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/phykit.py +87 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/service_factories.py +1 -0
- {phykit-2.1.80 → 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.81/phykit/version.py +1 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/PKG-INFO +1 -1
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/SOURCES.txt +1 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/entry_points.txt +4 -0
- {phykit-2.1.80 → phykit-2.1.81}/setup.py +4 -0
- phykit-2.1.80/phykit/version.py +0 -1
- {phykit-2.1.80 → phykit-2.1.81}/LICENSE.md +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/README.md +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/__init__.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/__main__.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/errors.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/__init__.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/boolean_argument_parsing.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/caching.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/circular_layout.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/color_annotations.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/discrete_models.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/files.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/json_output.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/parallel.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/parsimony_utils.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/plot_config.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/quartet_utils.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/stats_summary.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/helpers/streaming.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/__init__.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/__init__.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_entropy.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_length.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_length_no_gaps.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_outlier_taxa.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_recoding.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/alignment_subsample.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/base.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/column_score.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/composition_per_taxon.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/compositional_bias_per_site.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/create_concatenation_matrix.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dfoil.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dna_threader.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/dstatistic.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/evolutionary_rate_per_site.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/faidx.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/gc_content.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/identity_matrix.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/mask_alignment.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/occupancy_per_taxon.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/pairwise_identity.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/parsimony_informative_sites.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/phylo_gwas.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/plot_alignment_qc.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rcv.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rcvt.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/rename_fasta_entries.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/sum_of_pairs_score.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/taxon_groups.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/alignment/variable_sites.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/base.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ancestral_reconstruction.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/base.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/bipartition_support_stats.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/branch_length_multiplier.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/character_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/collapse_branches.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/concordance_asr.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/consensus_network.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/consensus_tree.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/cont_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/cophylo.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/covarying_evolutionary_rates.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/density_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/discordance_asymmetry.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/dvmc.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/evo_tempo_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/evolutionary_rate.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/fit_continuous.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/fit_discrete.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/hidden_paralogy_check.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/hybridization.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/independent_contrasts.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/internal_branch_stats.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/internode_labeler.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/kf_distance.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/last_common_ancestor_subtree.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/lb_score.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ltt.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/monophyly_check.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/nearest_neighbor_interchange.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/neighbor_net.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/network_signal.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ou_shift_detection.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/ouwie.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/parsimony_score.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/patristic_distances.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phenogram.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_heatmap.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_impute.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylo_logistic.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_glm.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_ordination.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_regression.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylogenetic_signal.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/phylomorphospace.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/polytomy_test.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/print_tree.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/prune_tree.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/quartet_network.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/quartet_pie.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rate_heterogeneity.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/relative_rate_test.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rename_tree_tips.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/rf_distance.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/root_tree.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/saturation.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spectral_discordance.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spr.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/spurious_sequence.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/stochastic_character_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/terminal_branch_stats.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/threshold_model.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_labels.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_distance.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tip_to_tip_node_distance.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/total_tree_length.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/trait_correlation.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/trait_rate_map.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/tree_space.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/treeness.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/treeness_over_rcv.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit/services/tree/vcv_utils.py +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/dependency_links.txt +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/requires.txt +0 -0
- {phykit-2.1.80 → phykit-2.1.81}/phykit.egg-info/top_level.txt +0 -0
- {phykit-2.1.80 → 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",
|
|
@@ -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(
|
|
@@ -8685,6 +8768,10 @@ def phylo_gwas(argv=None):
|
|
|
8685
8768
|
Phykit.phylo_gwas(sys.argv[1:])
|
|
8686
8769
|
|
|
8687
8770
|
|
|
8771
|
+
def phylo_anova(argv=None):
|
|
8772
|
+
Phykit.phylo_anova(sys.argv[1:])
|
|
8773
|
+
|
|
8774
|
+
|
|
8688
8775
|
def dfoil(argv=None):
|
|
8689
8776
|
Phykit.dfoil(sys.argv[1:])
|
|
8690
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",
|