def _get_block_title(self, block): # if self.is_write_block_titles is False then no block titles; # if only one taxon set, or attached taxon set mode, unless self.is_write_block_titles # is explicitly True, then again, we do not write block titles if not self._link_blocks(): return None if block in self._block_title_map: return self._block_title_map[block] if not block.label: title = str(id(block)) else: title = block.label idx = 1 original_title = title title = nexusprocessing.escape_nexus_token( original_title, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) while title in self._title_block_map: raw_title = "{}.{}".format(original_title, idx) title = nexusprocessing.escape_nexus_token( raw_title, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) idx += 1 self._title_block_map[title] = block self._block_title_map[block] = title return title
def _write_char_block(self, stream, char_matrix): taxon_label_map = collections.OrderedDict() for taxon in char_matrix: taxon_label_map[taxon] = nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) nchar = max([len(seq) for seq in char_matrix.values()]) if self.simple: stream.write("BEGIN DATA;\n") # note that this will only list the number of taxa for # which sequences are available ntaxstr = "NTAX={}".format(len(taxon_label_map)) else: stream.write("BEGIN CHARACTERS;\n") ntaxstr = "" self._write_block_title(stream, char_matrix) self._write_item_annotations(stream, char_matrix) self._write_item_comments(stream, char_matrix) self._write_link_to_taxa_block(stream, char_matrix.taxon_namespace) stream.write(" DIMENSIONS{} NCHAR={};\n".format(ntaxstr, nchar)) stream.write(" FORMAT {};\n".format(self._compose_format_terms(char_matrix))) stream.write(" MATRIX\n") if char_matrix.data_type == "continuous": state_value_writer = lambda x : stream.write("{} ".format(self.continuous_character_state_value_format_fn(x))) else: state_value_writer = lambda x : stream.write("{}".format(self.discrete_character_state_value_format_fn(x))) max_label_len = max(len(v) for v in taxon_label_map.values()) for taxon in char_matrix: stream.write(" {taxon_label:{field_len}} ".format(taxon_label=taxon_label_map[taxon], field_len=max_label_len)) for state in char_matrix[taxon]: state_value_writer(state) stream.write("\n") stream.write(" ;\n") stream.write("END;\n\n\n") self._write_character_subsets(stream, char_matrix)
def _write_char_block(self, stream, char_matrix): taxon_label_map = collections.OrderedDict() for taxon in char_matrix: taxon_label_map[taxon] = nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) nchar = max([len(seq) for seq in char_matrix.values()]) if self.simple: stream.write("BEGIN DATA;\n") # note that this will only list the number of taxa for # which sequences are available ntaxstr = " NTAX={}".format(len(taxon_label_map)) else: stream.write("BEGIN CHARACTERS;\n") ntaxstr = "" self._write_block_title(stream, char_matrix) self._write_item_annotations(stream, char_matrix) self._write_item_comments(stream, char_matrix) self._write_link_to_taxa_block(stream, char_matrix.taxon_namespace) stream.write(" DIMENSIONS{} NCHAR={};\n".format(ntaxstr, nchar)) stream.write(" FORMAT {};\n".format(self._compose_format_terms(char_matrix))) stream.write(" MATRIX\n") if char_matrix.data_type == "continuous": state_value_writer = lambda x : stream.write("{} ".format(self.continuous_character_state_value_format_fn(x))) else: state_value_writer = lambda x : stream.write("{}".format(self.discrete_character_state_value_format_fn(x))) max_label_len = max(len(v) for v in taxon_label_map.values()) for taxon in char_matrix: stream.write(" {taxon_label:{field_len}} ".format(taxon_label=taxon_label_map[taxon], field_len=max_label_len)) for state in char_matrix[taxon]: state_value_writer(state) stream.write("\n") stream.write(" ;\n") stream.write("END;\n\n\n") self._write_character_subsets(stream, char_matrix)
def _write_character_subsets(self, stream, char_matrix): if not hasattr(char_matrix, "character_subsets") or not char_matrix.character_subsets: return stream.write("BEGIN SETS;\n") for label, char_set in char_matrix.character_subsets.items(): label = nexusprocessing.escape_nexus_token(char_set.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) ranges = nexusprocessing.group_ranges(char_set.character_indices) pos = " ".join("-".join(str(c+1) for c in r) for r in ranges) stream.write(" charset {} = {};\n".format(label, pos)) stream.write("END;\n\n\n")
def _render_node_tag(self, node): """ Based on current settings, the attributes of a node, and whether or not the node is a leaf, returns an appropriate tag. """ tag = None if self.node_label_compose_fn: tag = self.node_label_compose_fn(node) else: tag_parts = [] is_leaf = len(node.child_nodes()) == 0 if is_leaf: if hasattr(node, 'taxon') \ and node.taxon \ and node.taxon.label is not None \ and not self.suppress_leaf_taxon_labels: tag_parts.append(self._get_taxon_tree_token(node.taxon)) if hasattr(node, 'label') \ and node.label \ and node.label is not None \ and not self.suppress_leaf_node_labels: tag_parts.append(str(node.label)) if len(tag_parts) > 0: tag = self.node_label_element_separator.join(tag_parts) else: return "" # anonymous leaf else: if hasattr(node, 'taxon') \ and node.taxon \ and node.taxon.label is not None \ and not self.suppress_internal_taxon_labels: tag_parts.append(self._get_taxon_tree_token(node.taxon)) if hasattr(node, 'label') \ and node.label \ and node.label is not None \ and not self.suppress_internal_node_labels: tag_parts.append(str(node.label)) if len(tag_parts) > 0: tag = self.node_label_element_separator.join(tag_parts) else: return "" if tag: tag = nexusprocessing.escape_nexus_token( tag, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) return tag else: return ""
def _write_taxa_block(self, stream, taxon_namespace): stream.write("BEGIN TAXA;\n") self._write_block_title(stream, taxon_namespace) self._write_item_annotations(stream, taxon_namespace) self._write_item_comments(stream, taxon_namespace) stream.write(" DIMENSIONS NTAX={};\n".format(len(taxon_namespace))) stream.write(" TAXLABELS\n") for taxon in taxon_namespace: stream.write(" {}\n".format( nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores), )) self._write_item_annotations(stream, taxon) self._write_item_comments(stream, taxon) stream.write(" ;\n") stream.write("END;\n\n")
def _render_node_tag(self, node): """ Based on current settings, the attributes of a node, and whether or not the node is a leaf, returns an appropriate tag. """ tag = None if self.node_label_compose_fn: tag = self.node_label_compose_fn(node) else: tag_parts = [] is_leaf = len(node.child_nodes()) == 0 if is_leaf: if hasattr(node, 'taxon') \ and node.taxon \ and node.taxon.label is not None \ and not self.suppress_leaf_taxon_labels: tag_parts.append(self._get_taxon_tree_token(node.taxon)) if hasattr(node, 'label') \ and node.label \ and node.label is not None \ and not self.suppress_leaf_node_labels: tag_parts.append(str(node.label)) if len(tag_parts) > 0: tag = self.node_label_element_separator.join(tag_parts) else: return "" # anonymous leaf else: if hasattr(node, 'taxon') \ and node.taxon \ and node.taxon.label is not None \ and not self.suppress_internal_taxon_labels: tag_parts.append(self._get_taxon_tree_token(node.taxon)) if hasattr(node, 'label') \ and node.label \ and node.label is not None \ and not self.suppress_internal_node_labels: tag_parts.append(str(node.label)) if len(tag_parts) > 0: tag = self.node_label_element_separator.join(tag_parts) else: return "" if tag: tag = nexusprocessing.escape_nexus_token(tag, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) return tag else: return ""
def _write_taxa_block(self, stream, taxon_namespace): stream.write("BEGIN TAXA;\n") self._write_block_title(stream, taxon_namespace) self._write_item_annotations(stream, taxon_namespace) self._write_item_comments(stream, taxon_namespace) taxon_to_include = self._get_taxa_to_include(taxon_namespace) stream.write(" DIMENSIONS NTAX={};\n".format(len(taxon_to_include))) stream.write(" TAXLABELS\n") for taxon in taxon_to_include: stream.write(" {}\n".format( nexusprocessing.escape_nexus_token(taxon.label, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores), )) self._write_item_annotations(stream, taxon) self._write_item_comments(stream, taxon) stream.write(" ;\n") stream.write("END;\n\n")
def _write_trees_block(self, stream, tree_list): stream.write("BEGIN TREES;\n") self._write_block_title(stream, tree_list) self._write_item_annotations(stream, tree_list) self._write_item_comments(stream, tree_list) self._write_link_to_taxa_block(stream, tree_list.taxon_namespace) self._set_and_write_translate_block(stream, tree_list.taxon_namespace) for tree_idx, tree in enumerate(tree_list): if tree.label: tree_name = tree.label else: tree_name = str(tree_idx+1) tree_name = nexusprocessing.escape_nexus_token( tree_name, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) stream.write(" TREE {} = ".format(tree_name)) self._newick_writer._write_tree(stream, tree) stream.write("\n") stream.write("END;\n\n")
def _write_trees_block(self, stream, tree_list): stream.write("BEGIN TREES;\n") self._write_block_title(stream, tree_list) self._write_item_annotations(stream, tree_list) self._write_item_comments(stream, tree_list) self._write_link_to_taxa_block(stream, tree_list.taxon_namespace) self._set_and_write_translate_block(stream, tree_list.taxon_namespace) for tree_idx, tree in enumerate(tree_list): if tree.label: tree_name = tree.label else: tree_name = str(tree_idx + 1) tree_name = nexusprocessing.escape_nexus_token( tree_name, preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) stream.write(" TREE {} = ".format(tree_name)) self._newick_writer._write_tree(stream, tree) stream.write("\n") stream.write("END;\n\n")
def _set_and_write_translate_block(self, stream, taxon_namespace): if not self.translate_tree_taxa: self._newick_writer.taxon_token_map = None return if self.translate_tree_taxa is True: m = {} for taxon_idx, t in enumerate(taxon_namespace): m[t] = str(taxon_namespace.accession_index(t)+1) # m[t] = str(taxon_idx) self._newick_writer.taxon_token_map = m else: self._newick_writer.taxon_token_map = dict(self.translate_tree_taxa) stream.write(" Translate\n") statement = [] for taxon in taxon_namespace: label = nexusprocessing.escape_nexus_token(str(taxon.label), preserve_spaces=self.preserve_spaces, quote_underscores=not self.unquoted_underscores) statement.append(" {} {}".format(self._newick_writer.taxon_token_map[taxon], label)) statement = ",\n".join(statement) stream.write("{}\n ;\n".format(statement))