Exemple #1
0
def constrained_consensus_tree_splits(self,
                                      constrainTree=None,
                                      min_freq=constants.GREATER_THAN_HALF,
                                      is_rooted=None,
                                      summarize_splits=True,
                                      fill_bitmask=None,
                                      is_bipartitions_constrain_updated=False,
                                      **split_summarization_kwargs):
    """
	Returns a consensus tree from splits in ``self``.
	
	Parameters
	----------
	constrainTree : Tree to constrain the consensus method
	
	min_freq : real
		The minimum frequency of a split in this distribution for it to be
		added to the tree.
	
	is_rooted : bool
		Should tree be rooted or not? If *all* trees counted for splits are
		explicitly rooted or unrooted, then this will default to |True| or
		|False|, respectively. Otherwise it defaults to |None|.
	
	fill_bitmask : int
		 Leafset bitmask of the constraint Tree 
	
	\*\*split_summarization_kwargs : keyword arguments
		These will be passed directly to the underlying
		`SplitDistributionSummarizer` object. See
		:meth:`SplitDistributionSummarizer.configure` for options.
	
	Returns
	-------
	t : consensus tree
	
	"""

    assert constrainTree.taxon_namespace is self.taxon_namespace

    if is_rooted is None:
        if constrainTree.is_rooted & self.is_all_counted_trees_rooted():
            is_rooted = True
        elif constrainTree.is_unrooted & self.is_all_counted_trees_strictly_unrooted(
        ):
            is_rooted = False

    constraintSplits = SplitDistribution(
        taxon_namespace=constrainTree.taxon_namespace)
    constraintSplits.count_splits_on_tree(
        tree=constrainTree,
        is_bipartitions_updated=is_bipartitions_constrain_updated,
        default_edge_length_value=None)
    fill_bitmask = constrainTree.seed_node.edge.bipartition._leafset_bitmask

    split_frequencies = self._get_split_frequencies()
    to_try_to_add = []
    _almost_one = lambda x: abs(x - 1.0) <= 0.0000001
    for s in split_frequencies:
        freq = split_frequencies[s]
        if (min_freq is None) or (freq >= min_freq) or (_almost_one(min_freq)
                                                        and _almost_one(freq)):
            to_try_to_add.append((freq, s))

    to_try_to_add.sort(reverse=True)

    ##We initiate the list with the constraintSplits
    splits_for_tree = [i for i in constraintSplits]
    splits_for_tree.extend([i[1] for i in to_try_to_add])

    con_tree = Tree.from_split_bitmasks(split_bitmasks=splits_for_tree,
                                        taxon_namespace=self.taxon_namespace,
                                        is_rooted=is_rooted)

    if summarize_splits:
        self.summarize_splits_on_tree(tree=con_tree,
                                      is_bipartitions_updated=False,
                                      **split_summarization_kwargs)
    return con_tree